• 仓库储存,存在添加减少,不存在插入ON DUPLICATE KEY UPDATE


    原文链接:https://blog.csdn.net/qq_42269354/article/details/100589640

    首先声明:ON DUPLICATE KEY UPDATE 为MySQL特有语法;

    语句的作用:当insert已经存在的记录时,执行update

    用法
    举个栗子:

    table1表中有几条数据如下:


    表中的主键为ID,现要插入一条数据,ID为4,name为修改4,password为xiugaimima4,正常写法为:

    INSERT INTO table1(`id`,`name`,`password`,`date`)
    VALUES('4','修改4','xiugaimima4',now());


    执行后刷新表数据,我们来看表中内容:

    此时表中数据增加了一条主键为id为’1’,name为’修改4’,password为’xiugaimima4’的记录,当我们再次执行插入语句时,会发生什么呢?

    执行:

    INSERT INTO table1(`id`,`name`,`password`,`date`)
    VALUES('4','修改4','xiugaimima4',now());


    MySQL告诉我们,我们的主键冲突了,看到这里我们是不是可以改变一下思路,当插入已存在主键的记录时,将插入操作变为修改:

    在原SQL后面增加 ON DUPLICATE KEY UPDATE

    INSERT INTO table1(`id`,`name`,`password`,`date`)
    VALUES('4','修改4','xiugaimima4',now())
    ON DUPLICATE KEY UPDATE
    id='5',password='xiugaimima5';


    我们再一次执行:

    可以看到,受影响的行为2,这是因为将原有的记录修改了,而不是执行插入,看一下表中数据:

     

    原来id为4的记录,改为了5,password也变为了xiugaimima5,很好的解决了重复插入问题。

    扩展
    当插入多条数据,其中不只有表中已存在的,还有需要新插入的数据,MySQL会如何执行呢?

    会不会报错呢?

    其实MySQL远比我们想象的强大,会只能的选择更新还是插入,我们尝试一下:

    INSERT INTO table1(`id`,`name`,`password`,`date`)
    VALUES('4','修改5','xiugaimima5',now()),
    ('5,'修改4','xiugaimima4',now())
    ON DUPLICATE KEY UPDATE
    id='5',name='修改4',password='xiugaimima4';

    运行SQL语句:

     

    MySQL执行了一次修改,一次插入,表中数据为:

     

    将ID为5的修改了两个字段的值,新增了一条ID为4的记录。

    VALUES修改,做到一条SQL语句批量修改多条数据的不同字段
    那么问题又来了,有人会说我ON DUPLICATE KEY UPDATE 后面跟的是固定的值,如果我想要分别给不同的记录修改不同的值怎么办呢?

    INSERT INTO table1(`id`,`name`,`password`)
    VALUES('4','修改4','xiugaimima4'),
    ('5,'修改5','xiugaimima5')
    ON DUPLICATE KEY UPDATE
    name=VALUES(name),password=VALUES(password);
    ails/100589640


    可以将后面的修改条件改为VALUES(password),动态的传入要修改的值;

    执行如下:

    成功的修改了两条记录,刷新一下表

    我们成功的将不同ID的name、password修改成了不同的值。

    但是,这是需要注意的是:

    选择写入的字段必须包含所有not null的字段,即非空的字段,如果少写了非空字段,则会报错!!

    比如,只想修改name字段,但是password字段也必须写上,如果不想修改password字段,可以写入原来的值。

    例如:


    虽然我们想要实现一个批量修改的操作,但是实则首先执行的是插入语句,当插入语句(INSERT INTO)执行过程中发现已有重复的主键时才会执行更新(UPDATE)语句,所以非空字段(NOT NULL)一定要写全!

    总结
    ON DUPLICATE KEY UPDATE 能够让我们便捷的完成重复插入的开发需求,能够让我们使用一条SQL语句实现批量修改多条记录的功能,但它是MySQL的特有语法,使用时应多注意主键和插入值是否是我们想要插入或修改的key、value;还应注意想要实现批量修改时非空字段都要写上。
    ————————————————
    版权声明:本文为CSDN博主「学无止境,好好学习,天天向上!」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_42269354/article/details/100589640

  • 相关阅读:
    RS485通信和Modbus协议(转)
    Modbus通讯错误检测方法
    Modbus消息帧
    Modbus通讯两种传输方式
    echarts自定义图例legend文字和样式
    host文件的作用
    webpack --watch和supervisor的不同
    vue中如何使用echarts
    Vue父子组件生命周期
    Git总结笔记
  • 原文地址:https://www.cnblogs.com/dk2557/p/12574963.html
Copyright © 2020-2023  润新知