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

有时候需要往表里增量插入数据,此时可能会出现唯一键重复而没法插入的错误。尤其是一些存储过程中经常出现【无则插入,有则更新】的逻辑。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    阿力木
***/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 了解SQL 1.1 数据库基础 ​ 学习到目前这个阶段,我们就需要以某种方式与数据库打交道。在深入学习MyS...
    锋享前端阅读 1,330评论 0 1
  • 数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格...
    假正经乄阅读 2,084评论 0 2
  • 1、MySQL启动和关闭(安装及配置请参照百度经验,这里不再记录。MySQL默认端口号:3306;默认数据类型格式...
    强壮de西兰花阅读 763评论 0 1
  • 一、背景 事情是从公司前段时间的需求说起,大家知道宜信是一个互联网金融企业,我们的很多数据与标准互联网企业不同,大...
    阿斯蒂芬2阅读 3,000评论 0 1
  • 系统用户: 1.sys system(sys权限最高) 2.sysman(操作企业管理器) 密码是安装的时候输入的...
    3hours阅读 1,710评论 0 0

友情链接更多精彩内容