zoukankan      html  css  js  c++  java
  • INSERT 中ON DUPLICATE KEY UPDATE的使用

    使用场景,在做全国各省ip访问统计时要将sparkStreaming的数据存在mysql中,按照一般设计,id,province,counts,time,这样就需要每次清空表,但是如果多分区的话就存在删除表的时候回出现后一个分区可能把前一个分区的数据删除掉,当然最好的办法是每次都只更新而不删除,但是如果通过代码实现比较复杂.

    此时我们需要的就是如果存在则更新,如果不存在则新增. 用redis的kv就可以很容易的实现.在MySQL中也有这样的功能.INSERT 中ON DUPLICATE KEY UPDATE

    但是这个在在使用的时候需要把省份设置成key ,unique key .这也是根据业务场景设计表的实践

    INSERT 中ON DUPLICATE KEY UPDATE的使用(本文重点)

    如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

    Sql代码  收藏代码
    1. mysql>INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;  
    2. mysql>UPDATE table SET c=c+1 WHERE a=1;  

    如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。

    注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:

    Sql代码  收藏代码
    1. mysql>UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;  

    如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

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

    示例:

    Sql代码  收藏代码
    1. mysql>INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)  
    2.           ->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);  

    本语句与以下两个语句作用相同:

    Sql代码  收藏代码
    1. mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)  
    2.           ->ON DUPLICATE KEY UPDATE c=3;  
    3. mysql>INSERT INTO table (a,b,c) VALUES (4,5,6)  
    4.           ->ON DUPLICATE KEY UPDATE c=9;  

    当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。

  • 相关阅读:
    学习制作iOS程序第八天:首页之本地缓存(26)
    学习制作iOS程序第五天:首页之推荐二手房(18)
    Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读
    计算税收在线工具
    XSS详解【3】---防御防御思路和防御方法
    XSS详解【2】---主要危害及其原理
    XSS详解【1】---基本概念和攻击原理
    11111111--临时保存
    Webpack探索【14】--- Typescript构建详解
    Webpack探索【13】--- Shimming详解
  • 原文地址:https://www.cnblogs.com/ExMan/p/10480601.html
Copyright © 2011-2022 走看看