我需要使用 python 中的 with ins 语句更新插入我的pairs表。我收到错误:psycopg2.errors.UndefinedTable:缺少表“ins”第 1 行的 FROM 子句条目:...pairs_dup_key DO UPDATE SET Exchange_pair_symbol=ins.exchan...
这是我正在运行的sql代码
WITH ins (a, b, c) AS
(VALUES ('sdf',2,3))
INSERT INTO pairs
(foo_id,v,w)
SELECT foo.id, ins.b, ins.c
FROM
ins
LEFT JOIN foo ON foo.name=ins.a
ON CONFLICT ON CONSTRAINT pairs_key DO UPDATE SET v=ins.b, w=ins.c;
我做错了什么?
最佳答案
您的 upsert 中缺少 EXCLUDED
变量。
请记住,冲突后,ins.a
和 ins.b
的值不再指向它们的来源,而是指向第一次尝试插入将它们放入表 pairs
中的 v
和 w
列中。因此,如果您想访问这些值,则必须查看 EXCLUDED
,而不是返回到上一个 SELECT
语句中的列。此外,您也不需要 CTE
。一个简单的 FROM (VALUES...)
就足够了,例如
INSERT INTO pairs (foo_id,v,w)
SELECT foo.id, ins.b, ins.c
FROM (VALUES ('sdf',2,3)) ins (a,b,c)
LEFT JOIN foo ON foo.name=ins.a
ON CONFLICT (foo_id) DO UPDATE SET v=EXCLUDED.v, w=EXCLUDED.w;
但是,如果您必须坚持 CTE,请尝试此..
WITH ins (a, b, c) AS
(VALUES ('sdf',2,3)
)
INSERT INTO pairs (foo_id,v,w)
SELECT foo.id, ins.b, ins.c
FROM ins LEFT JOIN foo ON foo.name=ins.a
ON CONFLICT (foo_id) DO UPDATE SET v=EXCLUDED.v, w=EXCLUDED.w;
关于sql - 在 postgres 中使用 CTE 更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68084439/