ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Postgresql 实现数据不存在插入,存在更新

2022-03-18 18:35:56  阅读:381  来源: 互联网

标签:insert 存在 Postgresql name into 插入 values test id


有时候需要往表里增量插入数据,此时可能会出现唯一键重复而没法插入的错误。尤其是一些存储过程中经常出现【无则插入,有则更新】的逻辑。PostgreSQL9.5 开始库提供了Upset方法可以轻松实现此逻辑:

语法形式

INSERT INTO 表名 VALUES ('值1', '值2', ...)
ON CONFLICT ON CONSTRAINT  唯一或排除约束名
DO UPDATE SET 列1='值', 列2='值', ...;

--或
INSERT INTO 表名 VALUES ('值1', '值2', ...)
ON CONFLICT(唯一或排除约束字段名)  
DO UPDATE SET 列1='值', 列2='值', ...;

示例

--若要从person表往TEST表更新全部记录,不重复插入,重复则更新
INSERT INTO TEST
     select * from person 
       on conflict on constraint  pk_test_deviceid_eventtype do 
        update set updatetime = excluded.updatetime, msec = excluded.msec;

实践

create table  test(id int constraint idx_t_id primary key,name varchar(20) constraint cst_name not null);
--插入测试数据
insert into test values(1,'ALMJ');
insert into test values(2,'Tom');
insert into test values(3,'Cat');

创建一个test表,并给id字段设置唯一键约束。看看此表的约束信息

select table_name, constraint_name, constraint_type
from   information_schema.table_constraints
where  table_name='test';
--result
/**
test	idx_t_id	PRIMARY KEY
test	2200_21059_1_not_null	CHECK
test	2200_21059_2_not_null	CHECK
**/

更新一条重复id的记录看

insert into test values(1,'阿力木') ON CONFLICT(id) do update set name=EXCLUDED.name ;
--result
/***
insert into test values(1,'阿力木') ON CONFLICT(id) do update set name=EXCLUDED.name
> Affected rows: 1
> 时间: 0.006s
***/

成功了,或者可能重复的时候不要报错也不要更新,自动跳过

insert into test values(2,'汤姆'),(3,'凯特') ON CONFLICT(id) do nothing ;
--result
/***
insert into test values(2,'汤姆'),(3,'凯特') ON CONFLICT(id) do nothing
> Affected rows: 0
> 时间: 0s
      id      name
       2	Tom
       3	Cat
       1	阿力木
***/

标签:insert,存在,Postgresql,name,into,插入,values,test,id
来源: https://www.cnblogs.com/codefree/p/16023073.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有