Insert Into On Conflict Excluded 工作如何?

问题描述 投票:0回答:1

我找不到任何足够好的文档,所以我只是想问问 Stackoverflow 的公民。

假设我有以下 SQL 查询:

INSERT INTO PUBLIC.TABLE_A (id, user, active, last_login) --The ID column is the primary key
SELECT
     b.id, b.user, b.active, b.last_login
FROM
     PUBLIC.TABLE_B as B
ON CONFLICT ON CONSTRAINT ID_PKEY 
DO UPDATE
     user = excluded.user,
     active = excluded.active,
     last_login = excluded.last_login

问题1)

user, active, and last_login come from PUBLIC.TABLE_A
,正确吗?

问题 2)

excluded.user, excluded.active, excluded.last_login
来自
PUBLIC.TABLE_B
的相同记录是否正确?

sql postgresql sql-insert conflict
1个回答
0
投票

INSERT INTO ... ON CONFLICT ... DO UPDATE
是 PostgreSQL 中的一条语句,允许您执行 INSERT 操作,如果发生冲突(通常是由于唯一或主键约束违反),您可以更新冲突行。

在给定的 SQL 查询中,您试图将 PUBLIC.TABLE_B 中的记录插入到 PUBLIC.TABLE_A 中。如果主键 ID 存在冲突,您将使用 PUBLIC.TABLE_B 中相应行的值更新 PUBLIC.TABLE_A 中的冲突行。

回答你的问题:

问题1) 是的,user、active、last_login来自PUBLIC.TABLE_A。这些是 TABLE_A 中的列名称,如果发生冲突,您将更新它们。

问题 2) 是的,excluded.user、excluded.active 和 excluded.last_login 是来自 PUBLIC.TABLE_B 的相同记录。 PostgreSQL 中的排除关键字指的是建议插入的行,在本例中,它来自 TABLE_B。如果存在冲突,排除的值将用于更新 TABLE_A 中的相应列。

因此,总而言之,如果 ID 主键存在冲突,查询将使用 PUBLIC.TABLE_B 中冲突行中相应列的值更新 PUBLIC.TABLE_A 中的 user、active 和 last_login 列。

© www.soinside.com 2019 - 2024. All rights reserved.