zoukankan      html  css  js  c++  java
  • MYSQL主键存在则更新,不存在则插入的解决方案(ON DUPLICATE KEY UPDATE)

    经常我们使用的最简单的数据库操作就是数据的更新,删除和插入,对于批量删除和插入的方法相信大家都很清楚,那么批量更新估计有的人就不知道了,并且还有批量插入,在插入时若有主键冲突则更新的操作,这在EAV模式中应该会经常用到吧。

    曾在网上搜索相关资料,有介绍三种方法:

    第一种是插入时通过where条件查询该条记录是否已经存在,就这么完了,话说这根本就没有解决问题好吧!!!

    第三种是使用REPLACE语句,该语句使用很简单,就是将INSERT INTO语句中的INSERT改为REPLACE就行,其他写法照旧,该条语句可以在索引或主键有冲突的情况下,删除已存在的记录,然后插入新记录。确实是达到我想要的功能了,只是觉得先删除再插入,真麻烦,虽然不需要我来操作。

    咦,第二种呢?来了,我比较推荐第二种做法,使用ON DUPLICATE KEY UPDATE,这个的作用是在索引或主键冲突的情况下更新语句,否则就插入。下面举例说:

    若表table的a字段为索引或主键,那执行下面语句:

    1
    INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

    如果a为1的这条记录不存在,那么就正常插入,若已存在,那么就更新操作将c字段加1.

    您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT…UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候会返回NULL。

    1
    INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

    这条语句相当于执行了以下两条语句

    1
    2
    INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3;
    INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=9;

    综上所述,个人还是喜欢ON DUPLICATE KEY UPDATE这种做法的。

  • 相关阅读:
    HDOJ 1556 线段树
    POJ 3977 折半枚举
    2017ACM省赛选拔赛题解
    关于四舍五入和截断
    POJ 3422 最小费用最大流
    Codeforces Round #407 (Div. 2) D. Weird journey 思维+欧拉
    POJ 3155 最大密度子图
    无向图最小割 stoer_wagner算法
    最大权闭合子图
    L2-001. 紧急救援 Dijkstra
  • 原文地址:https://www.cnblogs.com/adjk/p/5141596.html
Copyright © 2011-2022 走看看