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;

    执行结果:

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

  • 相关阅读:
    修改 MyEclipse 中的 jsp 和 servlet 模板
    javaWeb 数据库连接池连接数据库
    发现一个类的方法不够用时,可以使用的3种方法可以增强
    使用 greenDao 框架 操作数据库
    Android之使用Volley框架在ListView中加载大量图片
    js日期选择控件
    mysql 乱码问题
    java 使用反射技术解耦
    javaWeb 使用jsp开发 html过滤标签
    javaWeb 使用jsp开发 foreach 标签
  • 原文地址:https://www.cnblogs.com/yunianzeng/p/12587420.html
Copyright © 2011-2022 走看看