• MySQL的ON DUPLICATE KEY UPDATE用法


    平时我们在设计数据库表的时候总会设计 unique  或者 给表加上 primary key 的限制条件.

    此时 插入数据的时候 ,经常会有这样的情况:

    我们想向数据库插入一条记录:

    若数据表中存在以相同主键的记录,我们就更新该条记录。

    否则就插入一条新的记录。

    逻辑上我们需要怎么写:

    $result = mysql_query('select * from xxx where id = 1');
    $row = mysql_fetch_assoc($result);
    if($row){
    mysql_query('update ...');
    }else{
    mysql_query('insert ...');
    }

    但是这样写有两个问题

    1、效率太差,每次执行都要执行2个sql
    2、高并发的情况下数据会出问题,不能保证原子性 

    还好MySQL 为我们解决了这个问题:我们可以通过 ON DUPLICATE KEY UPDATE  达到以上目的, 且能保证操作的原子性和数据的完整性

    ON DUPLICATE KEY UPDATE 可以达到以下目的:

    向数据库中插入一条记录:

    若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。否则插入一条新的记录。

    示例:

    drop table t1;
    create table t1(
        id int not null auto_increment,
        name varchar(10) unique,
        count int default 0,
        primary key(id),
        index(name)
    )engine=innodb;
    
    insert into t1(id, name) values(1, "shenjian");
    
    insert into t1(id, name) values (111, "111"),(NULL, "abc"),(222, "222"),(NULL,"xyz");
    
    insert into t1(name)values("shenjian"),("aaa"),("bbb") on duplicate key update count=100;
    
    select * from t1;

    执行结果:

    使用一条语句实现了这个功能,保证操作的原子性;

  • 相关阅读:
    No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s).
    播放器 倒计时 闹钟 日期 分秒 时间算法
    iOS 8 以后获取地图坐标:
    数据存储(直接写入、NSUserDefaults、NSkeyedArchiver)
    图片处理 模糊效果
    手把手教你Windows下Go语言的环境搭建
    github 上传或删除 文件 命令
    域名解析-delphi 源码
    指针与引用
    指针
  • 原文地址:https://www.cnblogs.com/yunianzeng/p/12587420.html
Copyright © 2020-2023  润新知