sql - 在 postgres 中使用 CTE 更新插入

标签 sql postgresql sql-insert upsert

我需要使用 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.ains.b 的值不再指向它们的来源,而是指向第一次尝试插入将它们放入表 pairs 中的 vw 列中。因此,如果您想访问这些值,则必须查看 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/

相关文章:

function - 两个日期之间的月份函数

sql - 在 postgresql 中创建一个父项或一组父项的所有子项的表

c# - 使用 Context.SaveChanges 时出现异常

PHP MySQLI 准备语句在执行时返回 false

sql - JPA 按所选列获取结果列表顺序

mysql - 如果 "on delete"设置为CASCADE,我应该为mysql中的外键 "on update"设置什么?

postgresql - CakePHP 3 : Model Unit Test fails - "duplicate key value"

postgresql - 如何一次将多个值插入到 postgres 表中?

MySQL INSERT ... SELECT ... 永无止境,CPU 处于最大状态

sql - 通过 Shell 脚本从 Oracle DB 中提取 Insert 语句