解决java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘1‘ for key ‘book.PRIMARY‘

目录

问题

原因

解决方案


问题

场景:有张图书表,主键是自增的。现在我写了个添加图书功能。因为主键是自增的我插入时无需设置主键值。

关键代码如下:

然后就报这个异常了:

找了一圈并没有发现能解决我这个问题的。最终仔细分析想了下才发现端倪,听我慢慢道来。 

原因

先说结论

原因就是自增序列的值跟表里数据的主键值不匹配

何以见得?仔细观察这两次调用报错的提示信息有何不同

你第一出现的异常信息这里是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了。

  • 33
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒾酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值