gpt4 book ai didi

sql - INSERT [...] ON CONFLICT 可以用于外键违规吗?

转载 作者:行者123 更新时间:2023-11-29 11:17:34 28 4
gpt4 key购买 nike

给定

=> select * from referenced;
referenced_id | name
---------------+-------
1 | one
2 | two
3 | three

=> select * from entries;
entry_id | referenced_id | name
----------+---------------+------------------
1 | 3 | references three

其中 referenced_identry_id 是主键。

我想要一个用于 entries 的插入语句,如果 entry_id 已经存在或者引用的项目不存在,它会跳过插入。第一个很容易完成:

INSERT INTO entries
VALUES (1, 2, 'references two')
ON CONFLICT (entry_id) DO NOTHING;

是否也可以在这里检查外键是否存在?

最佳答案

是的,将您的输入行连接到引用表,从而删除 FK 列上不匹配的行:

INSERT INTO entries(entry_id, referenced_id, name)
SELECT val.entry_id, val.referenced_id, val.name
FROM (
VALUES (1, 2, 'references two')
-- more?
) val (entry_id, referenced_id, name)
JOIN referenced USING (referenced_id) -- drop rows without matching FK
ON CONFLICT (entry_id) DO NOTHING; -- drop rows with duplicate id

UPSERT 本身(INSERT ... ON CONFLICT DO NOTHING)仅对独特的违规行为使用react。 The manual:

ON CONFLICT can be used to specify an alternative action to raising a unique constraint or exclusion constraint violation error. (See ON CONFLICT Clause below.)

由于 VALUES 表达式现在不直接附加到 INSERT,因此列类型不是从目标表派生的。在操作非基本类型时,您可能需要明确地转换 输入值。见:

关于sql - INSERT [...] ON CONFLICT 可以用于外键违规吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36038751/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com