zoukankan      html  css  js  c++  java
  • 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;

    执行结果:

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

  • 相关阅读:
    Linux练习题
    我们普通大学生和国内一流大学的学生差距到底在哪里?
    Python修复图像文件后缀名
    Linux查找/扫描局域网打印机IP
    修改分区后的 Grub rescue
    Linux Matlab mex gcc 版本
    UFLDL新版教程
    Linux之时间、地点、人物、事件、情节
    GMchess Linux下的中国象棋游戏
    Linux 终端 忽略大小写
  • 原文地址:https://www.cnblogs.com/yunianzeng/p/12587420.html
Copyright © 2011-2022 走看看