使用场景:
操作某个用户信息时,没有就创建该用户,有则修改该用户信息。
方法一 :replace into
replace into 会根据唯一索引或主键进行判断,如果存在则覆盖写入字段,如果不存在则新增。该方法底层是先delete再insert,如果有子表依赖的话不建议使用。
样例:
方法二 :on duplicate key
on duplicate key 新增时如果导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE,如果不会导致唯一值列重复的问题,则插入新行。该方法使用是要小心避免多个唯一索引的情况下使用,当出现多个唯一索引时会出现修改任意一行数据的结果。
样例:
#values(col_name)函数只是取当前插入语句中的插入值
INSERT INTO demo(id,name,age) VALUES (1,''张山',19)
ON DUPLICATE KEY UPDATE name = values(name),age = values(age);
#age = age + values(age)可起到累加作用
INSERT INTO demo(id,name,age) VALUES (1,''张山',19)
ON DUPLICATE KEY UPDATE name = values(name),age = age + values(age)
#@ageVal可起到原子性查询数据
INSERT INTO demo(id,name,age) VALUES (1,''张山',@ageVal:=19)
ON DUPLICATE KEY UPDATE name = values(name),age = age + values(age);
select @ageVal;
#当id为主键,age为唯一索引时,数据中存在id=1,age=19时,上面的语句就相当于
UPDATE demo SET name='张山' WHERE id=1 OR age=19 LIMIT 1;