在插入数据的时候,如果插入的数据主键已经存在,那么这条数据就会报错主键冲突,并终止执行:
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 |
+
复制代码