开发我的个人博客项目时遇到了这个问题,Mybatis输出SQL报错信息如下:
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'qwe1111' for key 'blog_post_title_adf2f203_uniq'
### The error may exist in com/eastnotes/mapper/ArticleMapper.java (best guess)
### The error may involve com.eastnotes.mapper.ArticleMapper.addBlog-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO blog_post(title, body, created_time, excerpt, views, category_id, status, stick) VALUES(?, ?, ?, ?, ?, ?, ?, ?)
### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'qwe1111' for key 'blog_post_title_adf2f203_uniq'
; Duplicate entry 'qwe1111' for key 'blog_post_title_adf2f203_uniq'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'qwe1111' for key 'blog_post_title_adf2f203_uniq']
分析原因
从报错可以看出来,是title这个字段的值重复了,也就是说当前插入的数据,跟数据库中某个字段的数据冲突了。所以报错了。
进一步分析,一定是MySQL的某个字段添加了唯一键约束,才会出现这样的问题,通过查看表结构,发现确实如此,title字段添加了唯一键约束:
+---------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | UNI | NULL | |
| body | longtext | NO | | NULL | |
| created_time | datetime(6) | NO | | NULL | |
| modified_time | datetime(6) | YES | | NULL | |
| excerpt | varchar(200) | NO | | NULL | |
| views | int(10) unsigned | NO | | NULL | |
| words | int(10) unsigned | YES | | NULL | |
| author_id | int(11) | YES | MUL | NULL | |
| category_id | int(11) | NO | MUL | NULL | |
| status | varchar(1) | NO | | NULL | |
| stick | varchar(1) | NO | | NULL | |
+---------------+------------------+------+-----+---------+----------------+
解决办法
1.如果某个字段设定的就是不能插入重复值,那么不用改表结构,在插入时避免数据相同即可。
2.如果允许重复字段,那么解决起来更简单了,只需要在MySQL中把该字段的唯一键索引去掉即可,下面是删除唯一键属性的SQL语句
ALTER TABLE <表名> DROP INDEX <唯一约束名>;
唯一键约束名需要使用下面的命令查看:
show create table <表名>;
结果如下:
blog_post | CREATE TABLE `blog_post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`body` longtext NOT NULL,
`created_time` datetime(6) NOT NULL,
`modified_time` datetime(6) DEFAULT NULL,
`excerpt` varchar(200) NOT NULL,
`views` int(10) unsigned NOT NULL,
`words` int(10) unsigned DEFAULT NULL,
`author_id` int(11) DEFAULT NULL,
`category_id` int(11) NOT NULL,
`status` varchar(1) NOT NULL,
`stick` varchar(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `blog_post_title_adf2f203_uniq` (`title`),
KEY `blog_post_author_id_dd7a8485_fk_auth_user_id` (`author_id`),
KEY `blog_post_category_id_c326dbf8_fk_blog_category_id` (`category_id`)
) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8
其中blog_post_title_adf2f203_uniq
就是唯一键约束名。最后通过下面的命令删除唯一键约束即可:
ALTER TABLE blog_post DROP INDEX blog_post_title_adf2f203_uniq;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)