PostgreSQL 更新插入


PostgreSQL 更新插入

在本节中,我们将了解PostgreSQL upsert属性的工作,该属性用于插入或修改数据,如果正在插入的行已经存在并且在冲突命令的帮助下插入表中。

在 RDBMS(关系数据库管理系统)中,术语 upsert 被称为合并。当我们向特定表中插入新行时,如果该行已经存在,PostgreSQL 将升级该行,否则,它将添加新行。而这个过程被称为 upsert,它是insert或update 命令的组合。

在PostgreSQL 中,以下查询用于使用INSERT ON CONFLICT命令更新表:

INSERT INTO table_name(column_list)   
VALUES(value_list)  
ON CONFLICT target action;

tgreSQL在 INSERT 命令中添加了ON CONFLICT 目标操作子句。

在上面的命令中,Conflict_target可以是以下之一:

Target description
column_name 它用于指定特定表中的列名。
ON CONSTRAINT constraint_ name 在这种情况下,约束名称可以是 UNIQUE 约束的名称。
WHERE predicate 带有谓词的 WHERE 子句。

在上面的命令中,Conflict_action可以是以下之一:

Actions Description
DO NOTHING 它定义了如果行已经出现在表中,我们什么都不做。
DO UPDATE SET column_1 = value_1, .. WHERE condition 此操作用于更新表中的某些字段。

注意:如果我们使用的是较早版本的 PostgreSQL,我们将需要一种解决方法来拥有 upsert 功能,因为 ON CONFLICT 子句只能从 PostgreSQL 9.5 访问。版本。

PostgreSQL upsert 功能示例

要实时了解 PostgreSQL Upsert 功能的工作,我们需要遵循以下过程:

首先,我们将在下面的 Create 命令的帮助下创建一个名为customers的新表,如下所示:

CREATE TABLE officers (  
    officers_id serial PRIMARY KEY,  
    officers_name VARCHAR UNIQUE,  
    officers_email VARCHAR NOT NULL,  
    Officers_address VARCHAR NOT NULL  
);

输出

一旦我们实现了上面的查询,我们将得到下面的消息窗口;该官员\表已成功创建。

PostgreSQL 更新插入

Officers\表包含四列,例如officers_id, officers_name, officers_email, and officers_address.

并确保有关人员的名字唯一性,我们使用了唯一约束officers_name列。

完成创建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');

输出

一旦我们实现了上面的查询,我们将得到下面的消息窗口;这些已成功插入到官员\表中。

PostgreSQL 更新插入

让我们假设其中一位官员想要将他们的地址Newyork更改为 Florida,因此我们可以在 UPDATE 命令的帮助下对其进行修改。

我们使用下面的INSERT ON CONFLICT命令来描述 upsert 功能:

INSERT INTO officers (officers_name, officers_addrerss )  
VALUES('Olivia','Florida')  
ON CONFLICT ON CONSTRAINT officers_name  
DO NOTHING;

上面的命令定义,如果officers_name出现在军官表,什么事都不做或者干脆忽略它。

下面的命令与上面的命令类似,但由于INSERT命令的目标,它使用官员_名称列代替唯一约束官员_名称。

INSERT INTO officers   
VALUES(102,'Olivia','olivia22@gmail.com','Florida')  
ON CONFLICT (officers_name)  
DO NOTHING;

输出

执行上述命令后,我们将得到以下消息窗口,其中显示INSERT 0 0,这意味着DO-NOTHING操作将返回INSERT 0 0以表示冲突。因此,插入命令成功,并没有插入任何行。

PostgreSQL 更新插入

让我们假设我们希望将结合新officers_address老officers_address插入时,官员中已经存在。

在下面的命令中,我们使用 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;

输出

执行上述查询后,我们将得到以下消息窗口;这些values已成功更新到officers\表中。

PostgreSQL 更新插入

要检查上述 upsert 功能是否正常工作,我们将使用select 命令,如下面的命令所示:

  1. 从官员中选择*;

输出

执行上述命令后,我们将得到以下输出:

PostgreSQL 更新插入