被突然问到你知道insert or update ontable吗?当时懵了 ,在程序中写过这种,根据传进来的数据去判断主键存在与否选择更新和增加,没想到数据库语句也有这中情况,长见识啦,研究研究
采用mysql数据库作为示例
建立测试表
create table test
(
id int not null,
name varchar(20) null,
addr varchar(50) null,
tel varchar(50) null
);
create unique index test_addr_uindex
on test (addr);
create unique index test_id_uindex
on test (id);
create unique index test_name_uindex
on test (name);
alter table test
add constraint test_pk
primary key (id);
注意:这里的name 和addr字段被设置了唯一约束
replace into
先说结论,他会先校验插入的数据有没有主键索引冲突冲突和唯一索引冲突,如果有,则先删除冲突的所有数据,在更新,也就是先删除,在插入
先插入表中几行数据
执行违反多条约束的语句
replace into test (id,name,addr,tel)values (4, 5, 6, 888);
该条语句违反了 主键为4的数据冲突,name为5的数据冲突,addr为6的数据冲突,看结果吧
这就足以证明结论了吧,先删除了 id为4 name为5,addr为6的三条数据,在插入当前这一条
insert into on duplicate key update
先说结论 :插入并更新,也会检测主键索引冲突和唯一索引冲突,但是只会更新主键索引冲突的行,不会更新其他行
在上面的结果之上进行测试,添加违反多条约束的sql语句
insert into test(ID, name,addr, tel)VALUES (1, 2, 3,999)on duplicate key update name=666,addr=666,tel=666
该条语句违反了id为1的数据冲突,name为2的数据冲突,addr为3的数据冲突,看结果
结论为,即使有多个冲突,但不会删数据,只会更新数据,而且只更新主键冲突的数据行
如果主键自增的话,这两种语句会造成主键断号的情况