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, ...

  • 相关阅读:
    苹果一体机发射Wi-Fi
    iphone 屏蔽系统自动更新,消除设置上的小红点
    data parameter is nil 异常处理
    copy与mutableCopy的区别总结
    java axis2 webservice
    mysql 远程 ip访问
    mysql 存储过程小问题
    mysql游标错误
    is not writable or has an invalid setter method错误的解决
    Struts2中关于"There is no Action mapped for namespace / and action name"的总结
  • 原文地址:https://www.cnblogs.com/grasp/p/10136015.html
Copyright © 2011-2022 走看看