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;

    执行结果:

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

  • 相关阅读:
    url编码
    客户端安全-xss-1类型介绍
    阿里云扩容教程
    jquery获取和设置表单数据
    uMlet建模工具
    phpstorm的调试工具xdebug
    服务器如何处理http请求
    http基础实战
    协程
    Goroutine(协程)为何能处理大并发?
  • 原文地址:https://www.cnblogs.com/yunianzeng/p/12587420.html
Copyright © 2011-2022 走看看