PostgreSQL Upsert2025年3月17日 | 阅读 3 分钟 在本节中,我们将了解 PostgreSQL upsert 属性的工作原理,该属性用于插入或修改数据(如果被插入的行已经存在于表中),通过 insert on Conflict 命令实现。 在 RDBMS(关系数据库管理系统)中,术语 upsert 被称为合并。当我们向特定表中插入新行时,如果该行已经存在,PostgreSQL 将会升级该行;否则,它将添加新行。这个过程被称为 upsert,它是 insert 或 update command 的组合。 在 PostgreSQL 中,以下查询用于使用 INSERT ON CONFLICT 命令 upsert 表。 为了支持 upsert 属性,PostgreSQL 向 INSERT 命令添加了 ON CONFLICT target action 子句。 在上面的命令中,Conflict_target 可以是以下之一:
在上面的命令中,Conflict_action 可以是以下之一:
注意:如果我们使用的是 PostgreSQL 的早期版本,我们将需要一个解决方法来拥有 upsert 功能,因为 ON CONFLICT 子句只能从 PostgreSQL 9.5 版本访问。PostgreSQL upsert 功能的示例要了解 PostgreSQL Upsert 功能的实时工作原理,我们需要遵循以下过程: 首先,我们将使用以下 Create 命令创建一个名为 customers 的新表,如下所示: 输出 一旦我们实现了上面的查询,我们将得到下面的消息窗口;Officers 表已经成功创建。 ![]() Officers 表包含四列,例如 officers_id、officers_name、officers_email 和 officers_address。 为了确保 officer's name 的唯一性,我们对 officers_name 列使用 unique constraint。 完成创建 Officers 表后,我们将使用 INSERT 命令将一些数据插入其中。 输出 一旦我们实现了上面的查询,我们将得到下面的消息窗口;values 已经成功插入到 Officers 表中。 ![]() 让我们假设其中一位 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 命令成功,并且没有插入任何行。 ![]() 让我们假设我们想要在插入一个已经存在的 officer 时,将 new officers_address 与 old officers_address 合并。 在下面的命令中,我们使用 UPDATE 子句作为 INSERT 命令的操作 输出 执行上述查询后,我们将得到下面的消息窗口;values 已经成功更新到 officers 表中。 ![]() 要检查上面的 upsert 功能是否正常工作,我们将使用 select command,正如我们在下面的命令中看到的那样 输出 在执行上述命令后,我们将获得以下输出 ![]() 下一个主题PostgreSQL 子查询 |
我们请求您订阅我们的新闻通讯以获取最新更新。