mysql重复键_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的时候,需要保留被插入表的列,只更新指定列,那么就可以使用第二种方法。

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值