先说结论
都是按照主键或者表唯一主键进行判断是否冲突
/
用法 | 冲突 | 不冲突 |
---|---|---|
on duplicate key update | 表主键id 递增+1,记录id不变,并更新 | 正常插入 |
insert ignore into | 表主键id 递增+1,记录id不变,忽略插入 | 正常插入 |
replace into | 删除原记录,插入新记录,新纪录的插入 = insert | 正常插入 |
insert into | 报错 | 正常插入 |
1. insert … on duplicate key update
- 应用场景 : 查询记录,存在更新,不存在插入
按照主键或者表唯一主键进行判断是否冲突
INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1, b=4;
INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=values(c), b=4;
假设 目前表中记录是冲突的,上面两种 sql 更新的区别在 c 。
假设 原纪录 c = 1;
sql1 执行完 c = 2;执行的是正常 update中我们使用的逻辑。
sql2 执行完 c = 3; 使用了 values©
values() 取的是准备插入的values中的值。
**
2.insert ignore into
-
应用场景:记录存在时,不做插入
insert ignore into user_delay_record (user_code,delay_num) values('1002','100');
**
3. replace into
- 应用场景 : 记录存在时,删除原记录,重新插入新纪录。
replace into user_delay_record (user_code,delay_num) values('1003','300');