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 表已成功创建。
官员 表包含四个列,例如
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 表中。
让我们假设其中一名警官想将其地址
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 。因此,插入命令成功,并且没有插入行。
让我们假设我们想要在插入已经存在的
军官时将
新的军官地址与
老军官地址组合。
在下面命令,我们将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;
输出
执行以上查询后,将显示以下消息窗口;
值已成功更新到
军官 表中。
要检查上述upsert功能是否正常运行,我们将使用选择命令,如下面的命令所示:
输出
执行上述命令后,我们将获得以下输出: