解决插入数据时,唯一索引/主键冲突问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决插入数据时,唯一索引/主键冲突问题相关的知识,希望对你有一定的参考价值。

参考技术A on duplicate key update

格式:insert into 表名(字段1,字段2)values  (值1,值2) on duplicate key update 字段=新值;

作用:1、有唯一索引或主键冲突的数据插入时,只执行update后面的语句,更新指定字段的值

2、当无冲突数据插入时,就直接插入

例子:

insert into idoxu(id,stu_id,c_name) values (2,2,"huhu"),(7,7,"aha") on duplicate  key update c_name="huhu2";

执行后

replace

作用:1、有唯一索引或主键冲突的数据插入时,将删除以前的老数据,插入新的数据。如果新插入的数据中字段不全,则设为默认值,无默认值则为null(例子中istester字段,grade字段都设定了默认值为60)

2、当无冲突数据插入时,就直接插入(跟on duplicate  key update 一致)

replace into idoxu(id,stu_id,c_name) values (2,2,"huhu_replace"),(8,8,"enheng");

更新前:

执行后:

解决第16天0412作业(造数据 ,把istester表的所有数据,插入到 idoxu表)

使用on duplicate key update

insert into idoxu(id,stu_id,c_name) select id,id,uname from istester on duplicate key update c_name="new";

执行后

使用replace into

replace into idoxu(id,stu_id,c_name) select id,id,uname from istester;

执行后

PostgreSql INSERT 插入数据判断数据是否存在,存在则更新,不存在则插入

PostgreSql 使用INSERT INTO table_name(id,value) VALUES (1,1) ON CONFLICT(id) DO .... 语法(ON CONFLICT可以接多个字段,但必须存在唯一索引)
在INSERT INTO操作时当唯一键冲突可以做一些解决冲突的处理,一般有如下3种处理场景

  1. 当唯一键冲突时,不做处理

    ON CONFLICT(id) DO NOTHING
    
  2. 当唯一键冲突时,value列 +1

    ON CONFLICT (id) DO UPDATE SET value = table.value + 1
    
  3. 当唯一键冲突时,value设置为insert 时的value

    ON CONFLICT (id)DO UPDATE SET value = EXCLUDED.value
    

以上是关于解决插入数据时,唯一索引/主键冲突问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql实现upsert

MySQL replace into

mysql修改数据 -- 主键冲突

Postgres ON CONFLICT 缺少我声明支持唯一索引的主键冲突

具有唯一索引和主键的列给出唯一约束违规

解决数据重复插入的sql与锁方案