MySQL插入处理重复键值的几种方法
MySQL >创建表test1(ID int,NAME varchar(5),int类型,主键);
查询OK,0行受影响(0.01秒)
MySQL >创建表test2(ID int,NAME varchar(5),int类型,主键);
查询OK,0行受影响(0.01秒)
MySQL >选择*从test1;
+ + + +
ID名称类型| | | |
+ + + +
| 101 | AAA | 1 |
| 102 | BBB | 2 |
| 103 | CCC | 3 |
+ + + +
3行(0秒)
MySQL SELECT * FROM test2 >;
+ + + +
ID名称类型| | | |
+ + + +
| 201 | AAA | 1 |
| 202 | BBB | 2 |
| 203 | CCC | 3 |
| 101 | XXX | 5 |
+ + + +
4行(0秒)
1,替换成
首先发现重复删除和插入。如果记录中有多个字段,如果插入时没有插入某些字段,则新插入的记录是空的。
MySQL >更换为test1(ID、名称)(选择ID,名字从test2);
查询OK,5行受影响(0.04秒)
记录:4个重复:1个警告:0
MySQL >选择*从test1;
+ + + +
ID名称类型| | | |
+ + + +
| 101 | XXX |空|
| 102 | BBB | 2 |
| 103 | CCC | 3 |
| 201 | AAA |空|
| 202 | BBB |空|
| 203 | CCC |空|
+ + + +
6行(0秒)
值得注意的是,当你更换,如果插入的表中没有指定的列,它将表达的空,不是桌子的原创内容。如果插入的内容列为插入表列一样,空不appear.for例子
MySQL >更换为test1(ID、名称、类型)(选择ID、名称、类型);
查询OK,8行受影响(0.04秒)
记录:4个重复:4个警告:0
MySQL >选择*从test1;
+ + + +
ID名称类型| | | |
+ + + +
| 101 | XXX | 5 |
| 102 | BBB | 2 |
| 103 | CCC | 3 |
| 201 | AAA | 1 |
| 202 | BBB | 2 |
| 203 | CCC | 3 |
+ + + +
6行(0秒)
如果插入,则需要保留插入表的列,只更新指定的列,然后可以使用第二种方法。
2,插入到重复密钥更新中
发现重复更新操作。在原始记录的基础上,对指定的字段的内容进行更新,而其他字段的内容被保留。例如,我只是想要插入的ID的test2表名字段,但保持test1表类型字段:
MySQL >插入test1(ID、名称、类型)(选择ID、名称、类型);
查询OK,5行受影响(0.04秒)
记录:4个重复:1个警告:0
MySQL >选择*从test1;
+ + + +
ID名称类型| | | |
+ + + +
| 101 | XXX | 1 |
| 102 | BBB | 2 |
| 103 | CCC | 3 |
| 203 | CCC | 3 |
| 202 | BBB | 2 |
| 201 | AAA | 1 |
+ + + +
6行(0秒)
如果插入,只想插入原始表不是的数据,那么可以使用这第三种方法。
3,忽视
确定是否存在,不插入存在,否则插入。很容易理解MySQL在插入时不尝试执行此语句,违反了唯一性约束:
MySQL >插入忽略为test1(ID、名称、类型)(选择ID、名称、类型);
查询OK,3行受影响(0.01秒)
记录:4个重复:1个警告:0
MySQL >选择*从test1;
+ + + +
ID名称类型| | | |
+ + + +
| 101 | AAA | 1 |
| 102 | BBB | 2 |
| 103 | CCC | 3 |
| 203 | CCC | 3 |
| 202 | BBB | 2 |
| 201 | AAA | 1 |
+ + + +
6行(0秒)