我找不到任何足够好的文档,所以我只是想问问 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
的相同记录是否正确?
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 列。