当前位置:网站首页>on duplicate key update

on duplicate key update

2022-08-09 09:07:00 胡乐天

1.语法:

insert into 表名(字段名1,字段名2,字段名3,字段名4……)
values(字段1的值,字段2的值,字段3的值,字段4的值……)
on duplicate key update 某字段=某字段的值,某字段=某字段的值,某字段=某字段的值

例如:

-- id为主键,school_code为唯一约束
-- id使用的是uuid,一般不会重复
-- 如果学校编码列不存在nanshan,则插入该数据 
-- 如果存在nanshan这个学校编码,则将学校地址更换为‘东海’
insert into school(id,school_code,school_address)
values(UUID(),'nanshan','月亮湾')
on duplicate key update school_address='东海'

2.意思:

判断该数据是否存在于表中(存在规则:primary key 和 unique key),如果不存在则插入一条,如果存在则update该条数据。

3.注意:

1.假如插入一条数据时 主键 和 唯一性的数据都存在于表中,但是主键确定的数据和唯一性确定的数据数据不是同一条(实际上,出现这种情况为插入的数据有问题,我们只是假设出现这种情况),此时,update的数据为主键的那一条还是唯一性中确定的那一条呢?
经实验后,为主键那一条。

2.若执行的为insert语句,则返回的结果:Affected rows:1
若执行的为update语句,则返回的结果为:Affected rows: 0 或者 Affected rows: 2
即使是update,那影响的应该是0行或者一行啊,为啥出来个2呢。此处参考官方解释
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
在这里插入图片描述
红色区域翻译:
如果是insert则为1;
如果是update,但是update内容与原有数据一致则为0,与原有数据不一致则为2;

所以影响的行数在此处只是代表的是执行的是什么操作。

3.也有人这样写

insert ignore into ed_auth(phone_open_id,diagnostician_uid,name,school_code,id)
values(?,?,?,?,?)
on duplicate key update phone_open_id=?,name=?,school_code=?

这样与上边语法相比,在insert后面多了一个ignore,其实这是一个独立的语法(update中也可以使用),ignore的本意为忽略,此处则为忽略错误,即发生插入错误时(是数据错误,不是SQL语法错误),不报错,只是返回Affected rows: 0 。

原网站

版权声明
本文为[胡乐天]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44613100/article/details/117290713