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;

    执行结果:

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

  • 相关阅读:
    转载:山寨币凶猛
    Windows8.1 关机异常的解决
    Windows8、Windows8.1使用便签工具
    下载Sourceforge等国内无法下载站点文件的另一种方法
    专著出版成本计算
    PL2303 Windows8.1驱动
    转载:寒门再难出贵子
    华为荣耀品牌独立,子品牌战略能否实现新突破
    路由大战前夜,盘点智能路由的前世今生
    2020年实用工具推荐
  • 原文地址:https://www.cnblogs.com/yunianzeng/p/12587420.html
Copyright © 2011-2022 走看看