upsert操作报guild列歧义错误是否由unique唯一约束导致?
问题解答
错误原因判定
该错误不是由guild字段的UNIQUE约束导致的。
歧义产生的根本原因
在ON CONFLICT ... DO UPDATE语法的执行上下文中,数据库可以同时访问两个行数据集:
- 你当前尝试插入的新行数据,存放在名为
EXCLUDED的虚拟表中 prefixes表中已存在的旧行数据
你在WHERE子句中直接引用"guild"字段时,数据库无法判断该字段是取自prefixes表的旧行,还是取自EXCLUDED虚拟表的新插入行,因此触发字段引用歧义报错。
修正方案
你只需要在WHERE子句中明确指定字段所属的表即可,同时建议显式声明INSERT的目标字段,避免表结构变更后字段顺序不匹配的问题,修正后的语句如下:
INSERT INTO prefixes (guild, prefix) VALUES ($1, $2) ON CONFLICT (guild) DO UPDATE SET prefix = EXCLUDED.prefix WHERE prefixes.guild = $1;
上面写法中使用EXCLUDED.prefix直接引用待插入的新前缀值,不需要重复绑定$2参数,语法更规范。
内容的提问来源于stack exchange,提问作者Enz
相关产品推荐
相关产品推荐

