赞
踩
目录
场景:有张图书表,主键是自增的。现在我写了个添加图书功能。因为主键是自增的我插入时无需设置主键值。
关键代码如下:
然后就报这个异常了:
找了一圈并没有发现能解决我这个问题的。最终仔细分析想了下才发现端倪,听我慢慢道来。
先说结论
原因就是自增序列的值跟表里数据的主键值不匹配
何以见得?仔细观察这两次调用报错的提示信息有何不同
你第一出现的异常信息这里是1或者其他数,这个数代表目前自增序列为你分配的主键值
你再次调用还是会抛这个异常,但是这个值+1了。这让我瞬间想到了自增序列与当前表里数据主键不一致问题。你第一次调用mysql自增序列给你匹配了主键是1但是表里面有数据的主键是1了所以主键重复,这是mysql底层自增序列知道1重复了会进行自增++操作,这是第二次调用就会提示主键值2重复。你再次调用会提示3重复、、、、循环以往,直到自增队列的值在表里不存在了就没这个错误了。
为何会导致主键自增序列跟表里的数据主键不匹配呢?
导致我遇到这个问题的原因很简单
- CREATE TABLE Book (
- id INT PRIMARY KEY COMMENT '图书ID',
- title VARCHAR(100) NOT NULL COMMENT '标题',
- publisher VARCHAR(100) NOT NULL COMMENT '出版商',
- isbn VARCHAR(20) NOT NULL COMMENT 'ISBN号',
- publishDate DATE NOT NULL COMMENT '出版日期',
- author VARCHAR(100) NOT NULL COMMENT '作者'
- );
- INSERT INTO Book (id, title, publisher, isbn, publishDate, author) VALUES
- (1, 'Java编程', '清华大学出版社', '978-7-302-32950-4', '2023-12-01', '张三'),
- (2, 'Python入门指南', '人民邮电出版社', '9787115423681', '2023-11-15', '李四'),
- (3, 'C++ Primer Plus', '机械工业出版社', '9787111540953', '2024-01-20', '王五'),
- (4, '数据结构与算法分析', '电子工业出版社', '9787121347883', '2024-02-28', '赵六'),
- (5, '计算机网络', '高等教育出版社', '9787040292726', '2024-03-10', '孙七'),
- (6, '数据库系统概论', '清华大学出版社', '9787302423284', '2024-04-05', '周八'),
- (7, '软件工程导论', '人民邮电出版社', '9787111226532', '2024-05-18', '吴九'),
- (8, '操作系统原理', '机械工业出版社', '9787111538905', '2024-06-25', '郑十'),
- (9, '计算机组成原理', '电子工业出版社', '9787121270012', '2024-07-12', '钱十一'),
- (10, '嵌入式系统设计', '高等教育出版社', '9787040284652', '2024-08-30', '孙十二'),
- (11, '人工智能导论', '清华大学出版社', '9787302463242', '2024-09-05', '周十三'),
- (12, '大数据技术与应用', '人民邮电出版社', '9787111488774', '2024-10-18', '吴十四'),
- (13, '信息安全原理', '机械工业出版社', '9787111514145', '2024-11-25', '郑十五'),
- (14, '移动应用开发', '电子工业出版社', '9787121209830', '2024-12-08', '钱十六'),
- (15, '云计算基础', '高等教育出版社', '9787040263824', '2025-01-15', '孙十七'),
- (16, '物联网技术与应用', '清华大学出版社', '9787302346727', '2025-02-20', '周十八'),
- (17, '区块链原理与应用', '人民邮电出版社', '9787111530480', '2025-03-28', '吴十九'),
- (18, '软件测试与质量保障', '机械工业出版社', '9787111568384', '2025-04-10', '郑二十'),
- (19, 'Python数据分析', '电子工业出版社', '9787121308827', '2025-05-05', '钱二十一'),
- (20, 'Java Web开发', '高等教育出版社', '9787040348033', '2025-06-15', '孙二十二');
一开始我让al生成的表创建sql,就没指定为自增主键,但是已经初始化了20条数据,后面我才发现主键不是自增,就给修改成自增了,这是自增序列并不知道表里面有数据,主键已经排到20了。
这很简单直接删除表,重新创建保证主键定义为自增的之后再进行插入,还有插入最好不要指定id了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。