INSERT INTO ON CONFLICT中excluded的工作原理及相关疑问
关于PostgreSQL UPSERT语句的疑问解答
你的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
疑问解答:
赋值语句中的user、active、last_login是否来自PUBLIC.TABLE_A?
是。在DO UPDATE块中,直接写列名默认指代目标表(也就是PUBLIC.TABLE_A)的对应列。你当前的写法和PUBLIC.TABLE_A.user = excluded.user完全等价,PostgreSQL会自动关联目标表的字段。excluded.user、excluded.active、excluded.last_login是否完全等同于来自PUBLIC.TABLE_B的记录?
是。excluded是PostgreSQL处理冲突时生成的虚拟表,它存储的是原本要插入到TABLE_A的那条记录——也就是从TABLE_B查询出来的对应行数据。所以excluded中的字段值和TABLE_B里被选中的那一行的对应字段值完全一致。
内容的提问来源于stack exchange,提问作者Chicken Sandwich No Pickles
相关产品推荐
相关产品推荐

