INSERT INTO ON CONFLICT带WHERE子句时字段歧义报错求助
解决INSERT...ON CONFLICT中WHERE子句的字段歧义问题
为什么只有WHERE子句会报歧义?
在ON CONFLICT DO UPDATE的逻辑里:
SET子句的上下文是明确的——它就是要更新目标表(testing.names)的字段,所以未加限定的active_status会默认指向目标表,不会有歧义。- 但
WHERE子句的作用域同时覆盖了目标表和excluded虚拟表(存储原本要插入的行数据),此时直接写active_status,数据库无法判断你要对比的是目标表现有值,还是excluded里的待插入值,因此抛出歧义错误。
解决方案
有两种明确字段归属的方式:
方式1:给目标表添加别名,在WHERE子句中明确引用
INSERT INTO testing.names AS target ( id, first_name, active_status ) SELECT stage.id, stage.first_name, stage.active_status FROM testing.name stage ON CONFLICT ON CONSTRAINT names_pkey DO UPDATE SET active_status = excluded.active_status WHERE target.active_status <> excluded.active_status
方式2:直接用目标表的完整名称限定字段
INSERT INTO testing.names ( id, first_name, active_status ) SELECT stage.id, stage.first_name, stage.active_status FROM testing.name stage ON CONFLICT ON CONSTRAINT names_pkey DO UPDATE SET active_status = excluded.active_status WHERE testing.names.active_status <> excluded.active_status
内容的提问来源于stack exchange,提问作者Chicken Sandwich No Pickles
相关产品推荐
相关产品推荐

