PostgreSQL Upsert

2025年3月17日 | 阅读 3 分钟

在本节中,我们将了解 PostgreSQL upsert 属性的工作原理,该属性用于插入或修改数据(如果被插入的行已经存在于表中),通过 insert on Conflict 命令实现。

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

PostgreSQL 中,以下查询用于使用 INSERT ON CONFLICT 命令 upsert 表。

为了支持 upsert 属性,PostgreSQL 向 INSERT 命令添加了 ON CONFLICT target action 子句。

在上面的命令中,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 功能的实时工作原理,我们需要遵循以下过程:

首先,我们将使用以下 Create 命令创建一个名为 customers 的新表,如下所示:

输出

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

PostgreSQL Upsert

Officers 表包含四列,例如 officers_id、officers_name、officers_email 和 officers_address

为了确保 officer's name 的唯一性,我们对 officers_name 列使用 unique constraint

完成创建 Officers 表后,我们将使用 INSERT 命令将一些数据插入其中。

输出

一旦我们实现了上面的查询,我们将得到下面的消息窗口;values 已经成功插入到 Officers 表中。

PostgreSQL Upsert

让我们假设其中一位 officers 想要将其地址从 Newyork 更改为 Florida,因此我们可以借助 UPDATE 命令对其进行修改。

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

上面的命令定义了如果 officers_name 存在于 officers 表中,则什么也不做,或者直接忽略它。

下面的命令与上面的命令类似,但它在 INSERT 命令的目标中,使用了 officers_name 列代替了 unique constraint officers_name

输出

在实现上面的命令后,我们将得到下面的消息窗口,其中显示了 INSERT 0 0,这意味着 DO-NOTHING 操作将为冲突返回 INSERT 0 0。因此,insert 命令成功,并且没有插入任何行。

PostgreSQL Upsert

让我们假设我们想要在插入一个已经存在的 officer 时,将 new officers_addressold officers_address 合并。

在下面的命令中,我们使用 UPDATE 子句作为 INSERT 命令的操作

输出

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

PostgreSQL Upsert

要检查上面的 upsert 功能是否正常工作,我们将使用 select command,正如我们在下面的命令中看到的那样

输出

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

PostgreSQL Upsert
下一个主题PostgreSQL 子查询