目录
问题
场景:有张图书表,主键是自增的。现在我写了个添加图书功能。因为主键是自增的我插入时无需设置主键值。
关键代码如下:
然后就报这个异常了:
找了一圈并没有发现能解决我这个问题的。最终仔细分析想了下才发现端倪,听我慢慢道来。
原因
先说结论
原因就是自增序列的值跟表里数据的主键值不匹配
何以见得?仔细观察这两次调用报错的提示信息有何不同
你第一出现的异常信息这里是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了。