zoukankan      html  css  js  c++  java
  • MySQL的on duplicate key update 使用说明与总结

    用法总结
    基本用法:on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。

    1,on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。
    2,记录已存在时,只会更新on duplicate key update之后指定的字段。
    3,如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。
    4,特殊用法:参考第五、第六条。

    一,构造测试数据

    注意里面的唯一键

    drop table if exists tbl_test;
    create table tbl_test(
    id int primary key auto_increment,
    name varchar(30) unique not null,
    age int comment '年龄',
    address varchar(50) comment '住址',
    update_time datetime default current_timestamp on update current_timestamp
    ) comment '测试表';

    insert into tbl_test(name,age,address) values('huahua',20,'京华市'),('caocao',21,'京海市');

    效果如下:

    二,sql用法介绍1
    on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。

    如下sql:
    insert into tbl_test(id,name,age,address) values(1,'huahua1',201,'京华市1')
    on duplicate key update
    age = values(age),
    address = values(address);

    从执行结果可以看出,更新了id为1的age,address两个字段,而name字段没有修改生效。由此我们可以得出两个重要结论:
    1,on duplicate key update 语句根据主键id来判断当前插入是否已存在。
    2,已存在时,只会更新on duplicate key update之后限定的字段。

    三,sql用法介绍2
    如下sql:
    insert into tbl_test(name,age,address) values('huahua',202,'京华市2')
    on duplicate key update
    age = values(age),
    address = values(address);

    从执行结果看,这次没有传id,但是age,address字段仍然更新了。
    由此可以得出另一个结论:
    3,on duplicate key update 语句也可以根据唯一键来判断当前插入的记录是否已存在。

    三,sql用法介绍3
    如下sql:
    insert into tbl_test(name,age,address) values('huahua2',202,'京华市2')
    on duplicate key update
    age = values(age),
    address = values(address);

    这条执行就比较简单了,没有主键或唯一键字段值相同,即判断当前记录不存在,新插入一条。

    四,sql用法介绍4
    如下sql:
    insert into tbl_test(id,name,age,address) values(1,'huahua1',202,'京华市2')
    on duplicate key update
    name = values(name),
    age = values(age),
    address = values(address);

    从上面可以看出,连唯一键name也被修改了。结论:
    4,如果传递了主键,是可以修改唯一键字段内容的。
    这里要注意,如果这里的name修改为 caocao,huahua2
    会报唯一键冲突的。可以自行尝试。

    五,on dupdate key update之后没有用values的情况
    分为两种情况:
    1,如果为如上面的name = "abc",则会一直更新为"abc".
    2,如果为如上面的name = name ,则name会保持数据库中的值,不会更新。

    六,对values使用判断
    如下sql
    insert into tbl_test(id,name,age,address) values(1,'huahua1',202,'京华市2')
    on duplicate key update
    name = ifnull(values(name),name),
    age = values(age)
    达到的效果是,如果传入的name值为null,则不更新。不为null则更新。这里与mybatis配合使用比较好。

  • 相关阅读:
    ubuntu 搭建 php 环境
    【转】送给和我一样曾经浮躁过的PHPer程序猿,希望有帮助
    thinkphp iis下去掉index.php
    windows定时执行PHP的技巧
    js 生成随机数字的方法
    Linux下crontab命令的用法
    收藏下(设为收藏,设为首页)
    C#扩展方法的理解
    Win7 访问共享时输入正确密码仍然提示密码错误
    SQL Server 获取插入记录后的自动编号ID
  • 原文地址:https://www.cnblogs.com/ycc-blog-2020/p/13855840.html
Copyright © 2011-2022 走看看