mysql插入重复键值方法示例

发布时间:2021-01-11编辑:脚本学堂
mysql插入重复键值的键值的处理方法,包括replace into、insert into on duplicate key update、ignore into语句的用法举例。

mysql/ target=_blank class=infotextkey>mysql数据库中,当unique列在一个unique键上插入包含重复值的记录时,默认insert时会报1062错误,mysql有三种不同的处理方法。

先建立2个测试表,在id列上创建unique约束:
 

复制代码 代码示例:

mysql> create table test1(id int,name varchar(5),type int,primary key(id));
query ok, 0 rows affected (0.01 sec)

mysql> create table test2(id int,name varchar(5),type int,primary key(id));
query ok, 0 rows affected (0.01 sec)

mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | aaa  |    1 |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
+-----+------+------+
3 rows in set (0.00 sec)

mysql> select * from test2;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 201 | aaa  |    1 |
| 202 | bbb  |    2 |
| 203 | ccc  |    3 |
| 101 | xxx  |    5 |
+-----+------+------+
4 rows in set (0.00 sec)

1、replace into
发现重复的先删除再插入,如果记录有多个字段,在插入时如果有的字段没有赋值,那么新插入的记录这些字段为空。
 

复制代码 代码示例:

mysql> replace into test1(id,name)(select id,name from test2);
query ok, 5 rows affected (0.04 sec)
records: 4  duplicates: 1  warnings: 0

mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | xxx  | null |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
| 201 | aaa  | null |
| 202 | bbb  | null |
| 203 | ccc  | null |
+-----+------+------+
6 rows in set (0.00 sec)

注意,当replace时,如果被插入的表如果没有指定列,会用null表示,而不是这个表原来的内容。
如果插入的内容列和被插入的表列一样,则不会出现null。

例如:
 

复制代码 代码示例:

mysql> replace into test1(id,name,type)(select id,name,type from test2);
query ok, 8 rows affected (0.04 sec)
records: 4  duplicates: 4  warnings: 0

mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | xxx  |    5 |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
| 201 | aaa  |    1 |
| 202 | bbb  |    2 |
| 203 | ccc  |    3 |
+-----+------+------+
6 rows in set (0.00 sec)

如果insert时,需要保留被插入表的列,只更新指定列,那么就可以使用第二种方法。// http://www.pprar.com/f01/index_23_1.html

2、insert into on duplicate key update
发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。例如我只想插入test2表的id,name字段,但是要保留test1表的type字段:
 

复制代码 代码示例:

mysql> insert into test1(id,name,type)(select id,name,type from test2) on duplicate key update test1.name=test2.name;
query ok, 5 rows affected (0.04 sec)
records: 4  duplicates: 1  warnings: 0

mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | xxx  |    1 |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
| 203 | ccc  |    3 |
| 202 | bbb  |    2 |
| 201 | aaa  |    1 |
+-----+------+------+
6 rows in set (0.00 sec)

如果insert时,只想插入原表没有的数据,那么可以使用第三种方法。

3、ignore into
判断是否存在,存在不插入,否则插入。很容易理解,当插入时,违反唯一性约束,mysql不会尝试去执行这条语句。例如:
 

复制代码 代码示例:

mysql> insert ignore into test1(id,name,type)(select id,name,type from test2);
query ok, 3 rows affected (0.01 sec)
records: 4  duplicates: 1  warnings: 0

mysql> select * from test1;
+-----+------+------+
| id  | name | type |
+-----+------+------+
| 101 | aaa  |    1 |
| 102 | bbb  |    2 |
| 103 | ccc  |    3 |
| 203 | ccc  |    3 |
| 202 | bbb  |    2 |
| 201 | aaa  |    1 |
+-----+------+------+
6 rows in set (0.00 sec)