在插入数据的时候,如果插入的数据主键已经存在,那么这条数据就会报错主键冲突,并终止执行:
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
解决办法:
1、忽略:ignore 忽略错误,正常终止插入,数据不会改变。
insert ignore into 表名 (字段列表) values (值列表);
2、替换:replace 将新数据完整覆盖旧数据。
replace into 表名 (字段列表) values (值列表);
3、更新:on duplicate key 可以预先设定需要覆盖的旧数据,如果发生冲突,则更新指定的字段为指定的新值即可。
insert into 表名 (字段列表) values (值列表) on duplicate key update 字段名=新值, 字段名=新值, ...;
测试数据:
mysql> select * from test; +----+-------+------+------+ | id | name | sex | age | +----+-------+------+------+ | 1 | name1 | 男 | 5 | | 2 | name2 | 女 | 10 | | 3 | name3 | 男 | 15 | | 4 | name4 | 男 | 20 | +----+-------+------+------+
``` 插入一条已经存在的主键数据 id = 1 mysql> insert into test (id, name, sex, age) values (1, 'name5', '女', 25); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
忽略 ignore 冲突数据不变 mysql> insert ignore into test (id, name, sex, age) values (1, 'name5', '女', 25); Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> select * from test; +----+-------+------+------+ | id | name | sex | age | +----+-------+------+------+ | 1 | name1 | 男 | 5 | | 2 | name2 | 女 | 10 | | 3 | name3 | 男 | 15 | | 4 | name4 | 男 | 20 | +----+-------+------+------+
替换 replace 直接替换冲突主键的值为最新的数据 mysql> replace into test (id, name, sex, age) values (1, 'name5', '女', 25); mysql> select * from test; +----+-------+------+------+ | id | name | sex | age | +----+-------+------+------+ | 1 | name5 | 女 | 25 | | 2 | name2 | 女 | 10 | | 3 | name3 | 男 | 15 | | 4 | name4 | 男 | 20 | +----+-------+------+------+
更新 on duplicate key 如果发生冲突,则更新指定的字段为指定的新值即可 mysql> insert into test (id, name, sex, age) values (1, 'name1', '男', 5) on duplicate key update name='name1', sex=' 男', age=5; mysql> select * from test; +----+-------+------+------+ | id | name | sex | age | +----+-------+------+------+ | 1 | name1 | 男 | 5 | | 2 | name2 | 女 | 10 | | 3 | name3 | 男 | 15 | | 4 | name4 | 男 | 20 | +----+-------+------+------+ ```
百度分享代码,如果开启HTTPS请参考李洋个人博客
还没有评论,来说两句吧...