文章目录
replace into 与 insert into on duplicate key update 的使用和不同点
mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点
参考URL: cnblogs.com/jkko123/p/7285641.html
replace into和insert into on duplicate key update都是为了解决我们平时的一个问题
就是如果数据库中存在了该条记录,就更新记录中的数据,没有,则添加记录。
replace into会首先尝试先往表里面插入记录,因为我们的ID是主键,不可重复,显然这条记录是无法插入成功的,然后replace into会把这条已存在的记录删掉,然后再插入,所以会显示影响行数是2。
但是有些时候我们的需求是,如果记录存在则更新指定字段的数据,原有字段数据仍保留。
执行如下语句:
INSERT INTO test (id, name)
VALUES(2, 'bb')
ON DUPLICATE KEY
UPDATE
name = VALUES(name);
VALUES(字段名)表示获取当前语句insert的列值,VALUES(name)表示的就是’bb’
insert into on duplicate key update语句的做法是先插入记录,如果不成功,则更新记录,但是为什么影响的行数是2?
显然如果insert into on duplicate key update语句仅仅只是在原记录基础上进行更新操作的话,自增字段是不会自动加1的,说明它也进行了记录删除操作。
先插入记录,如果不成功,则删除原记录,但保留了除update语句后字段的值,然后把保留的值与需要更新的值合并,然后插入一条新记录。
总结:
replace into 与 insert into on duplicate key update都是先尝试插入记录,如果不成功,则删除记录,replace into不保留原记录的值,而insert into on duplicate key update保留。然后插入一条新记录。
replace into的用法以及与inset into、insert ignore的区别
mysql中常用的三种插入数据的语句:
- insert into表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错;
- replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引的话,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
- insert ignore表示,如果已存在,就不会进行插入,跳过这个
在向表中插入数据时,我们经常会遇到这样的情况:1、首先判断数据是否存在;2、如果不存在,则插入;3、如果存在,则更新。
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,
- 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
- 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
replace into 和insert ignore是基于唯一索引或主键基础上使用的。
replace into和insert ignore into 与insert into区别:
- replace into和insert ignore into 与insert into区别在于insert into插入与主键相同记录会报错而前者不会。
INSERT IGNORE 与INSERT INTO的区别:
- INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。