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