Postgresql 在发生冲突时,不执行任何操作不会停止查询继续执行下一个insert语句

Postgresql 在发生冲突时,不执行任何操作不会停止查询继续执行下一个insert语句,postgresql,Postgresql,我使用WITH运行表A和表B中的两条INSERT语句。第一条INSERT语句有一个ON CONFLICT子句,如果A.name中存在重复项,则不执行任何操作。第二条语句依赖于表a中的成功插入,因此它尝试向表B中输入空值。不执行任何操作对第一条语句不执行任何操作,但第二条语句继续执行,如何停止它 将第一个_插入作为插入到 组组提示、组名称、创建人、创建日期 值$1、$2,选择用户\u id 来自用户 其中users.cognito_id='${created_by}', 现在选择::时间戳 关于约

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

将第一个_插入作为插入到 组组提示、组名称、创建人、创建日期 值$1、$2,选择用户\u id 来自用户 其中users.cognito_id='${created_by}', 现在选择::时间戳 关于约束组的冲突\u name\u unique不执行任何操作 正在返回由创建的id 在组中插入用户组id,用户id,是管理员,加入日期 价值观 从第一次插入中选择id, 从第一次插入中选择创建人, 符合事实的 现在选择::时间戳 返回* 如果插入发生在GROUPS表中,我希望插入GROUPS\u USERS\u REL表。如果有冲突,我希望整个查询结束。相反,根据第一次插入中的冲突,在组\u USERS\u REL中插入空值

如果有更简单的方法,请随时发表评论。

插入到。。。价值观将始终尝试使用您提供的值列表仅插入一条记录。当查询SELECT id FROM first_insert未返回任何记录时,子查询SELECT id FROM first_insert将计算为NULL,因此这就是表中的结果

如果要插入可变数量的行(即零行或一行),则需要插入到。。。选择语句,其中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 *
给出的答案解决了您遇到的问题。但是,我注意到另一个清理代码的机会:

不要使用VALUES子句,而是从users中选择user_id,并提供要通过查询参数插入的常量。生成完整的查询文本:

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

非常感谢,非常感谢。