添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
英勇无比的野马  ·  在 ASP.NET Core ...·  1 年前    · 

在插入数据的时候,如果插入的数据主键已经存在,那么这条数据就会报错主键冲突,并终止执行:

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 |
+----+-------+------+------+
复制代码
分类:
后端
  •