首页 > 数据库 >Postgresql insert on conflict笔记

Postgresql insert on conflict笔记

时间:2023-05-10 14:55:16浏览次数:52  
标签:insert 00 Postgresql target ... conflict name

描述

针对数据写入时有主键冲突的情况,INSERT ON CONFLICT语法可以将冲突主键的INSERT行为转换为UPDATE行为,从而实现冲突主键的覆盖写入。该特性又称UPSERT覆盖写,与MySQL的REPLACE INTO类似。

[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
    [ ON CONFLICT [ conflict_target ] conflict_action ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
其中,conflict_target为:
    ( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] )
其中,conflict_action为:
    DO NOTHING
    DO UPDATE SET { column_name = { expression | DEFAULT } |
                    ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] )
                  } [, ...]
              [ WHERE condition ] 

ON CONFLICT子句可以实现覆盖写入。该子句由conflict_target和conflict_action组成。

参数 说明
conflict_target conflict_action取值为Do Update时,conflict_target需要指定用来定义冲突的主键列或唯一索引列。conflick_action取值为Do Nothing时,conflict_target可省略。
conflict_action 用于指定冲突后需要执行的动作。取值说明:DO NOTHING:如果conflict_target指定的列有冲突,则丢弃待插入的数据。DO UPDATE:如果conflict_target指定的列有冲突,则按照后面的UPDATE子句进行数据覆盖。

创建测试表

CREATE TABLE jruing.user_info (
    "name" varchar(255),
    "age" int4,
    "sex" varchar(255),
    "inserttime" date,
    constarint "user_info_pk" primary key ("name")
)

新增测试数据

insert into table_name(name, age, sex,inserttime) values('jruing','男',27,'2023-05-10 00:00:00') 

insert 新增时忽略已存在的数据

insert into table_name(name, age, sex,inserttime) values('jruing',27,'男','2023-05-10 00:00:02') on conflict(name) do nothing

insert 有则更新,无则插入

insert into table_name(name, age, sex, inserttime) values ('jruing',27,'男','2023-05-10 00:00:02') on conflict(name) do update set inserttime=EXCLUDED.inserttime

注意事项

confilct中包含的字段必须为冲突的列名(冲突是指违反主键约束,唯一约束等其他约束)

标签:insert,00,Postgresql,target,...,conflict,name
From: https://www.cnblogs.com/jruing/p/17387971.html

相关文章

  • 关于arcgis和postgresql数据库创建企业级地理数据库的配置文件
    第一:需要将arcgis的C:\ProgramFiles(x86)\GeoScene\Desktop\Desktop10.8\DatabaseSupport\PostgreSQL\12\Windows64这个路径下的文件拷贝到postgresql数据库的安装目录的lib文件夹中;第二:需要将五个文件libeay32.dll、libiconv-2.dll、libintl-8.dll、libpq.dll和ssleay32.d......
  • KingbaseES 实现 MySQL 函数 last_insert_id
    用户从mysql迁移到金仓数据库过程中,应用中使用了mysql函数last_insert_id()来获取最近insert的那行记录的自增字段值。mysql文档中关于函数的说明和例子:LAST_INSERT_ID()如果没有参数,则LAST_INSERT_ID()返回一个BIGINTUNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语......
  • PostgreSQL-HA 高可用集群在 Rainbond 上的部署方案
    PostgreSQL是一种流行的开源关系型数据库管理系统。它提供了标准的SQL语言接口用于操作数据库。repmgr是一个用于PostgreSQL数据库复制管理的开源工具。它提供了自动化的复制管理,包括:故障检测和自动故障切换:repmgr可以检测到主服务器故障并自动切换到备用服务器。自动故......
  • NetBackup 10.2 新功能介绍:PostgreSQL 和 MySQL 自动化恢复达成
    原文来自:VERITAS中文社区2023-04-27在执行恢复任务时,手动提取、更新数据库和实例并将其附加到PostgreSQL和MySQL是常规操作。而在最新的NetBackup10.2版本中,执行恢复已不再需要上述手动流程,PostgreSQL和MySQL数据库的备份恢复变得更加便捷、高效。正所谓:NetBackup......
  • WARNING: Running pip as the 'root' user can result in broken permissions and con
      pipinstall-rrequirements.txt报错"WARNING:Runningpipasthe'root'usercanresultinbrokenpermissionsandconflictingbehaviourwiththesystempackagemanager.Itisrecommendedtouseavirtualenvironmentinstead:https://pip.pyp......
  • postgresql数据预热
    test=#select*frompg_available_extensionswherenamelike'%prewarm%'orderbyname;name|default_version|installed_version|comment-------------+-----------------+-------------------+-----------------------sys_pre......
  • shp数据插入sde连接的PostgreSQL库(二)---利用GeoTools读取shp数据并插入到空间数据库
    前言 上一篇介绍了如何利用Maven构建GeoTools,这一节将介绍下一步内容,如何读取shp文件里面的信息并插入到SDE连接的PostgresSQL现有表中。背景 从搭建环境到实现上述功能,大概用了7个工作日,从4月25日开始的,中间有个五一假期。公司的后端都不愿意接这活,只能自己上了。......
  • PostgreSQL数据块损坏一例
           PostgreSQL数据块损坏一例原创七月流火紧到说2022-07-0609:00发表于四川背景数据库备份报错ERROR:invalidmemoryallocrequestsize18446744073709551613这种问题可以首先想到使用zero_damaged_pages自动修复,但遗憾的是并没有效果,这种方法......
  • PostgresQL-toast表数据损坏修复案例
    PostgresQL-toast表数据损坏修复案例pg_statistic-toast表块损坏修复当访问该表的时候报错:missingchunknumber0fortoastvalue59747165inpg_toast_2619首先我们要找到出问题的表:toast表的表名是字符串"pg_toast"与表tbl的oid"2619"拼接而成,可以直接查询oid=26191、......
  • PostgreSQL存储大量base64
           PostgreSQL存储大量base64原创七月流火紧到说2022-05-2809:00发表于四川背景现场反馈数据库pg_wal日志有2.3TB,占满了磁盘空间,数据库处于宕机状态。并且数据库没有做备份。日志堆积的主要原因是配置的归档失败了。排查过程中发现主要以下几......