我们大家都知道当unique列在一个UNIQUE键上需要插入包含重复值的记录的时候,其默认insert的时候有时报错误,MySQL插入处理重复键值的2种不同的处理方法,下面我们对其进行分别介绍。
先建立2个测试表,在id列上创建unique约束。
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)
MySQL插入处理重复键值方法1、REPLACE INTO
发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。
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 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的时候,需要保留被插入表的列,只更新指定列,那么就可以使用第二种方法。
MySQL插入处理重复键值方法2、INSERT INTO ON DUPLICATE KEY UPDATE
发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。例如我只想插入test2表的id,name字段,但是要保留test1表的type字段:
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的时候,只想插入原表没有的数据,那么可以使用其他的MySQL插入处理重复键值的方法。