gpt4 book ai didi

postgresql - ON CONFLICT DO NOTHING 不会停止查询继续下一个插入语句

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

我正在使用 WITH 运行两个 INSERT 语句(表 A 和表 B)。第一个 INSERT 语句有一个 ON CONFLICT CLAUSE,如果 A.name 中有重复,则不要执行任何操作。第二条语句依赖于对表 A 的成功插入,因此它尝试向表 B 中输入空值。DO NOTHING 对第一条语句没有任何作用,但第二条语句继续执行,我该如何停止它?

WITH first_insert AS (INSERT INTO 
groups(group_cuid,group_name,created_by,date_created)
VALUES ($1,$2,(SELECT user_id
FROM users
WHERE users.cognito_id='${created_by}'),
(SELECT now()::timestamp))
ON CONFLICT ON CONSTRAINT group_name_unique DO NOTHING
RETURNING id,created_by
)
INSERT INTO groups_users_rel(group_id,user_id,is_admin,date_joined)
VALUES (
(SELECT id FROM first_insert),
(SELECT created_by FROM first_insert),
true,
(SELECT now()::timestamp)
)
RETURNING *

如果插入发生在 GROUPS 表中,我想插入到 GROUPS_USERS_REL 表中。如果有冲突,我希望整个查询结束。相反,根据第一次插入中的 CONFLICT,将空值插入到 GROUPS_USERS_REL 中。

如果有更简单的方法可以做到这一点,请随时发表评论。

最佳答案

INSERT INTO ... VALUES (...) 将始终尝试使用您提供的值列表恰好插入一条记录。当查询 SELECT id FROM first_insert 没有返回任何记录时,子查询 (SELECT id FROM first_insert) 的计算结果将是 NULL,这样就结束了在你的 table 上。

如果你想插入可变数量的行(即零或一),那么你需要一个 INSERT INTO ... SELECT ... 语句,使用 SELECT 决定添加哪些行(如果有的话)。

在您的情况下,它看起来像这样:

WITH first_insert AS (
...
)
INSERT INTO groups_users_rel(group_id,user_id,is_admin,date_joined)
SELECT
id,
created_by,
true,
now()::timestamp
FROM first_insert
RETURNING *

关于postgresql - ON CONFLICT DO NOTHING 不会停止查询继续下一个插入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56263847/

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