首页 > 数据库 >在 PostgreSQL 中使用 EXCLUDE 值进行 Upsert(重复更新时插入、合并)

在 PostgreSQL 中使用 EXCLUDE 值进行 Upsert(重复更新时插入、合并)

时间:2023-04-08 14:47:44浏览次数:40  
标签:PostgreSQL EXCLUDED age excluded EXCLUDE type id Upsert

上次,我们读到了如何在 PostgreSQL 中使用 UPSERT

在快速回顾中,UPSERT 是 INSERT ON DUPLICATE UPDATE 的缩写,如果它们与以前的条目不匹配,则倾向于将 INSERT 值插入表中。如果有,它们会自动更新。

PostgreSQL 中的 EXCLUDED 是什么

EXCLUDED 是 DBMS 给一个特殊表的名称,在该表中我们有为 INSERTION 提议的所有行。一旦 INSERT 操作运行,这些行可能会插入到该表中。

这主要是在 ON CONFLICT DO UPDATE 子句之前,专门针对此表。此外,SET 和 WHERE 子句往往具有访问此 EXCLUDED 表的权限。

因此,下次你尝试 INSERT 某些内容时,如果它似乎满足你的需求,你可以使用 EXCLUDED 表。我们希望你清楚本文中使用的基本术语及其背后的机制。

让我们开始学习一些方法,其中许多是简短而有效的变通方法,以实现 EXCLUDED 表的使用。

PostgreSQL 中的基本 EXCLUDE 用法

可以实现第一个非常简单的 EXCLUDE 用法。

  1. 让我们为动物创建一个 TABLE

    createtableanimal(idintPRIMARYKEY,ageint,typeTEXT);

    TYPE 这里代表动物类型。可以是猫、狗、马等。

  2. 让我们插入一些值。

    insertintoanimalvalues(1,10,'Dog'),(2,12,'Horse')
  3. 现在,让我们继续编写 EXCLUDED 的查询。

    insertintoanimalvalues(1,3,'Cat'),(3,4,'Kitten')onconflict(id)doupdatesetid=excluded.id,age=excluded.age,type=excluded.type;

那么这里发生了什么?首先,有一个副本。

集合 (1, 3, 'Cat') 违反了 PRIMARY KEY 的唯一约束,因为已经存在带有键 1 的 (1, 10, 'Dog')

所以我们调用 ON CONFLICT DO UPDATE,然后一旦它发现违规,我们将该行的键设置为正在插入的新数据集的键,从而覆盖先前的条目。

输出将是这样的。

输出:

在 PostgreSQL 中使用排除

但是,这取决于你是否要执行此操作。如果在插入时,你可能不想覆盖,而是保持前一个条目完整,那么在这种情况下,你根本不应该使用此查询。

PostgreSQL 中基本 EXCLUDED 用法的结构差异

如果用户可能试图保持语句紧凑和可读,他们可能会尝试避免使用上述查询,其中:

setid=excluded.id,age=excluded.age,type=excluded.type;

如果大量数据是 INSERTED 或 UPDATED,这可能会变得混乱并随后导致问题。

一个更简单的方法是改用它。

set(id,age,type)=(EXCLUDED.id,EXCLUDED.age,EXCLUDED.type)

这倾向于对元素进行分组,并且与上面描述的几乎相同,但更加有序和可读。

标签:PostgreSQL,EXCLUDED,age,excluded,EXCLUDE,type,id,Upsert
From: https://www.cnblogs.com/Thenext/p/17298521.html

相关文章

  • SpringBoot @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})注
    @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})该注解的作用是,排除自动注入数据源的配置,用exclude属性进行排除指定的类,在springBoot中使用多数据源时,加上@SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})DataSourceAutoConfigur......
  • EFCore连接PostgreSql
    1、PostgreSql安装(windows安装)1.1、下载下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads如下图,选择windows版本的安装包下载 1.2、安装直接双击安装,期间会让你选择安装路径,数据存储路径,默认密码,端......
  • PostgreSQL 13 pacemaker 高可用集群
    环境介绍 操作系统版本CentOSLinuxrelease7.8.2003(Core)  数据库版本psql(13.10)  PCS集群版本[root@hd-clw-select-proxysql01~]# rpm-qa|greppacemakerpacemaker-libs-1.1.23-1.el7_9.1.x86_64pacemaker-cli-1.1.23-1.el7_9.1.x86_64pacemaker-1.1.2......
  • PG技术大讲堂 - 第12讲:PostgreSQL wal作用与管理
     PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同......
  • PostgreSQL+PostGIS扩展 ogr2ogr命令导入gdb地图数据
    实现将arcgis支持的.gdb中的数据和qgis支持的.gpkg中的数据导入到Postgres数据库中第一步:安装PostgreSQL安装好后自带pgAdmin管理工具相当于是一个图形管理工具第二步:......
  • postgresql signal 5生成core分析
    postgresqlsignal5生成core,如下:[zjh@hs-10-20-30-193data]$gdblightdbcore.49666GNUgdb(GDB)RedHatEnterpriseLinux7.6.1-120.el7Copyright(C)2013Free......
  • Python数据库操作—— PostgreSQL
    使用pip3安装psycopg2pipinstallpsycopg2增删改查(CRUD)新建数据库PostgreSQL不支持"SHOWDATABASES"语句,需要使用"SELECT*FROMPG_DATABASE;"进行查询,才能获取......
  • 数据库系列:postgresql中boolean字段与smallint字段的自动转换
    1、使用postgre账号进入到相应的模式下执行:CREATEORREPLACEFUNCTIONboolean_to_smallint(bboolean)RETURNSsmallintAS$$BEGINRETURN(b::bool......
  • 解决PostgreSQL插入数据时主键ID重复问题
    问题执行以下插入数据语句INSERTINTOstudent(name)values('Tony');抛出如下异常ERROR:duplicatekeyvalueviolatesuniqueconstraint"student_pkey"DETAIL:......
  • PostgreSQL查询所有表的信息
    查询PostgreSQL所有表信息有以下两种方式:使用工具提供的\d命令查询使用SQL语句进行查询方法一:通过命令行查询登录:psql-U用户名\l:查看系统中现存的数据库\c:切换库......