zoukankan      html  css  js  c++  java
  • mysql 插入更新判断 ON DUPLICATE KEY UPDATE 和 REPLACE INTO

    平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件.
    此时 插入数据的时候 ,经常会有这样的情况:
    我们想向数据库插入一条记录:

    • 若数据表中存在以相同主键的记录,我们就更新该条记录。
    • 否则就插入一条新的记录。

    ON DUPLICATE KEY UPDATE

    如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。 
    例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果:

    INSERT INTO test (a, b, c) VALUES ('1', 'b1', 'c1')  ON DUPLICATE KEY UPDATE b='b2', c='c2';  
    
    UPDATE test SET b = 'b2', c = 'c2' WHERE a = '1'

    主要方式 :

    INSERT ... SELECT

    INSERT ... ON DUPLICATE KEY UPDATE

    INSERT ... ON DUPLICATE REPLACE

    replace into

    replace into原理

    replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则没有此行数据的话,直接插入新数据。

    replace into的应用注意事项

    插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。如果数据库里边有这条记录,则直接修改这条记录;如果没有则,则直接插入,在有外键的情况下,对主表进行这样操作时,因为如果主表存在一条记录,被从表所用时,直接使用replace into是会报错的,这和replace into的内部原理是相关(ps.它会先删除然后再插入)。
    正确做法是- 即先删除该条存在的数据,然后再次插入这条数据,这和外键约束相悖呢,因此只能采用update和insert这样的组合,来应对外键约束

    replace into的使用形式

    replace into tbl_name(col_name, ...) values(...)
    replace into tbl_name(col_name, ...) select ...
    replace into tbl_name set col_name=value, ...

  • 相关阅读:
    es6 export 和export default的区别
    Vue 中 export及export default的区别
    深入学习jQuery选择器系列第一篇——基础选择器和层级选择器
    深入理解javascript选择器API系列第三篇——HTML5新增的3种selector方法
    深入理解javascript选择器API系列第二篇——getElementsByClassName
    深入理解javascript选择器API系列第一篇——4种元素选择器
    理解jQuery对象$.html
    深入理解DOM节点操作
    深入理解DOM节点关系
    深入理解DOM节点类型第一篇——12种DOM节点类型概述
  • 原文地址:https://www.cnblogs.com/grasp/p/10136015.html
Copyright © 2011-2022 走看看