PostgreSQL教程

PostgreSQL Upsert

在本节中,我们将了解 PostgreSQL upsert 属性的作用,该属性用于 插入或修改(如果已插入该行并且借助于 在冲突中插入命令在表中显示该行),则该数据。
在RDBMS(关系数据库管理系统)中),术语upsert被称为 merge 。当我们在特定表中插入新行时,PostgreSQL将升级该行(如果已经存在),否则它将添加新行。这个过程称为upsert,它是插入或更新命令。
在 PostgreSQL 中,以下查询用于使用 INSERT ON CONFLICT 命令 更新该表:
INSERT INTO table_name(column_list) 
VALUES(value_list)
ON CONFLICT target action;
为支持upsert属性,PostgreSQL在INSERT命令中添加了 ON CONFLICT目标操作子句。
在上述命令中, Conflict_target 可以是以下之一:
目标 说明
column_name 它用于在特定表中指定列名。
ON CONSTRAINT constraint_ name 在这种情况下,约束名称可以是UNIQUE约束的名称。
WHERE predicate 带有谓词的WHERE子句。
在上面的命令中, Conflict_action 可以是以下之一:
动作 说明
DO NOTHING 它定义了如果表中已经存在该行,我们什么也不做。
DO UPDATE SET column_1 = value_1, .. WHERE condition 此操作用于更新表中的某些字段。
注意: 如果我们使用的是PostgreSQL的早期版本,我们将需要一种变通方法以具有upsert功能,因为ON CONFLICT子句只能从PostgreSQL 9.5访问。版。

PostgreSQL upsert功能示例

要实时了解PostgreSQL Upsert功能的工作,我们需要遵循以下过程:
首先,我们将在下面的创建命令的帮助下创建一个名为 customers 的新表,如下所示:
CREATE TABLE officers (
  officers_id serial PRIMARY KEY,
  officers_name VARCHAR UNIQUE,
  officers_email VARCHAR NOT null,
  Officers_address VARCHAR NOT null
);
输出
一旦实现了上面的查询,我们将获得以下消息窗口; Officers 表已成功创建。
PostgreSQL Upsert
官员 表包含四个列,例如 legers_id,peoples_name,peoples_email和Officer_address
为了确保官员姓名的唯一性,我们在 legers_name 列中使用 unique约束
创建完 Officers 表,我们将使用INSERT命令在其中插入一些数据。
INSERT INTO officers 
VALUES 
(101,'Denny', 'denny11@hotmail.com','Newyork'),
(102,'John', 'john23@gmail.com','Boston'),
(103,'Olivia', 'olivia22@gmail.com','Newyork'),
(104,'Mike', 'mike34@gmail.com','Newyork');
输出
一旦实现了上面的查询,我们将获得以下消息窗口; 已成功插入 Officers 表中。
PostgreSQL Upsert
让我们假设其中一名警官想将其地址 Newyork更改为佛罗里达州,因此我们可以借助UPDATE命令对其进行修改。
我们使用以下 INSERT ON CONFLICT 命令来描述upsert功能:
INSERT INTO officers (officers_name, officers_addrerss )
VALUES('Olivia','Florida')
ON CONFLICT ON CONSTRAint officers_name
do NOTHING;
上面的命令定义了 级别的人员表中是否存在 级别的人员名称,并且什么也不做或者只是忽略它。
下面的命令与上面的命令类似,但是由于 INSERT 命令的目标,因此它使用 legers_name 列代替 唯一约束军官名
INSERT INTO officers 
VALUES(102,'Olivia','olivia22@gmail.com','Florida')
ON CONFLICT (officers_name)
do NOTHING;
输出
执行上述命令后,我们将获得以下消息窗口,其中显示 INSERT 0 0 ,这意味着 不做任何事情操作将针对冲突返回 INSERT 0 0 。因此,插入命令成功,并且没有插入行。
PostgreSQL Upsert
让我们假设我们想要在插入已经存在的 军官时将 新的军官地址老军官地址组合。
在下面命令,我们将UPDATE子句用作INSERT命令的 操作:
INSERT INTO officers 
VALUES(102,'Olivia','olivia22@gmail.com','Florida')
ON CONFLICT (officers_name)
do UPDATE SET officers_address = 
EXCLUDED.officers_address || ',' || officers.officers_address;
输出
执行以上查询后,将显示以下消息窗口; 已成功更新到 军官 表中。
PostgreSQL Upsert
要检查上述upsert功能是否正常运行,我们将使用选择命令,如下面的命令所示:
Select * from officers;
输出
执行上述命令后,我们将获得以下输出:
PostgreSQL Upsert
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4