Sql 语句的对比
总结一下 REPLACE INTO 、 INSERT ON DUPLICATE KEY UPDATE 、 INSERT IGNORE INTO 这几种方式的区别。
INSERT IGNORE INTO
INSERT IGNORE INTO表示,如果中已经存在相同的记录,则忽略当前新数据eg:
连续执行两次以下语句(id为主键):
insert into t(id, update_time) values(1, now());
则会报错:`ERROR 1062 (23000): Duplicate entry '1' for key 1`
如果加上 ignore
则不会报错:
insert ignore into t(id, update_time) values(1, now());
使用了ignore关键字,但是记录不会被覆盖,数据仍是第一次插入的结果。
replace into
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。eg:
replace into t(id, update_time) values(1, now());
INSERT ON DUPLICATE KEY UPDATE
使用了ON DUPLICATE KEY UPDATE,如果插入会导致UNIQUE索引或PRIMARY KEY中出现重复值,则改为对其执行UPDATE方法。
如果再插入时唯一索引 a
重复,以下两句话等效:
INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE t1 SET c=c+1 WHERE a=1;
如果 b
也是唯一索引,那么相当于以下SQL:
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
注意:后面增加了 LIMIT
,只会即使有多个唯一索引重复,耽误插入, ON DUPLICATE KEY UPDATE
只会更新一个。所以应该避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。