Mysql存在则编辑不存在则新增

假设有一张demo表,主键为id,唯一索引是code

create table demo
(
id int auto_increment,
name int null,
gender int null,
age int null,
code int null,
constraint demo_pk
primary key (id)
);

create index demo_code_uindex
on demo (code);

// An highlighted block
var foo = 'bar';

方法一 replace into
replace into 会根据唯一索引或主键进行判断,如果存在则覆盖写入字段,如果不存在则新增。
此方法有坑,如果主键是自增的,且通过唯一索引来进行操作时,主键会变更,该方法底层是先进性delete,在insert
如果有子表依赖的话不建议使用。

replace into 事例

REPLACE INTO demo(id, name, gender, age, code) VALUES (1,‘1’,1,1,1)
1
通过主键修改,此时没有任何问题,id还是1

当我们通过唯一索引code来更改。

REPLACE INTO demo(name, gender, age, code) VALUES (‘1’,1,1,1)
1

没执行一次 主键id都会自增。

方法二 on duplicate key
on duplicate key 如果遇到重复的唯一索引则会进行update,否则进行新增,没有replcae的坑,不会先进行delete 在进行 insert

on duplicate key 事例:

INSERT INTO demo(name, gender, age, code)
VALUES (‘1’,
1,
2,
2)
ON DUPLICATE KEY UPDATE name = values(name),
gender = values(gender),
age = values(age),
code = if(values(code) = 1,values(code), code)

无论执行多少次,主键值都是不会变的。

但是此方法也有坑,如果表中不止一个唯一索引的话,在特定版本的mysql中容易产生dead lock(死锁)

你可能感兴趣的:(mysql)