mysql数据插入INSERT INTO ON DUMPLICATE KEY UPDATE执行

执行逻辑图

image

初始化表结构

-- 初始化表结构
drop table if exists empinfo;
create table if not exists empinfo(
    id int
    ,name varchar(127)
    ,age int
    ,mark varchar(127)
    ,PRIMARY key (id)
)
;

image

第一次插入数据id=1

insert into empinfo(id,name,age) values(1,'a',12)
on duplicate key update 
     name=values(name)
    ,age=values(age)
;
select * from empinfo;

说明: 当主键不存在时,执行insert into语句,等值SQL如下:

insert into empinfo(id,name,age) values(1,'a',12);

注意:update使用values时,只支持字段名,不支持计算和赋值

image

第二次插入数据id=1

insert into empinfo(id,name,age) values(1,'a',13)
on duplicate key update 
     name=values(name)
    ,age=values(age)
;
select * from empinfo;

说明:主键1已存在,执行update语句,等值SQL如下:

update empinfo
set name='a'
    ,age=13
where id = 1
;

image

更新mark字段

update empinfo set mark='mmmmmmmm';
select * from empinfo;

image

第三次插入数据id=1

insert into empinfo(id,name,age) values(1,'a',14)
on duplicate key update 
     name=values(name)
    ,age=values(age)
;
select * from empinfo;

说明: 主键1已存在,执行update语句,此处不涉及的字段mark保持不变,等值SQL如下:

update empinfo
set name='a'
    ,age=14
where id = 1
;

image

注意: 此处更新的值取的是insert中的VALUE值。

另外一种写法

insert into empinfo(id,name,age) values(2,'a',12)
on duplicate key update 
     name=name
    ,age=age+1
;

说明: 支持直接赋值,当主键已存在时,等值SQL如下:

update person
set name=name
    ,age=age+1
where id = 1
;

注意: 此处更新的值取的是结果表里的字段或直接赋值

批量插入

insert into empinfo(id,name,age) values(1,'a',15),(2,'b',20)
on duplicate key update 
     name=values(name)
    ,age=values(age)
;

与replace into的差异

id不存在
    均为insert into

id已存在
    replace into                        为delete + insert into
    INSERT INTO ON DUMPLICATE KEY UPDATE为update

注意

ON DUPLICATE KEY UPDATE语句,并且要插入的行将导致惟一索引或主键中出现重复值,则会对旧行进行更新。但主键和唯一键同事存在的时候,选择主键。

posted @ 2024-01-25 17:17  chenzechao  阅读(15)  评论(0编辑  收藏  举报