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

  • 相关阅读:
    TI科学家谈浮点DSP未来发展
    请爱护你的JTAG烧录口---记录
    程序猿必看
    富人与穷人的区别--转自红尘
    DSP已经英雄迟暮了吗?FPGA才是未来的大杀器?
    FPGA+ARM or FPGA+DSP?
    DDR3调试记录
    调试记录1
    有关FPGA
    Nginx常见配置说明
  • 原文地址:https://www.cnblogs.com/grasp/p/10136015.html
Copyright © 2011-2022 走看看