sql - Postgres 触发器函数 ON CONFLICT 更新另一个表

标签 sql postgresql triggers upsert

编写一个 Postgres 触发器函数以在“主”表中插入插入 到“复制”表中。在对“主”表执行 DELETE 操作时,我将“复制”表上的“isdeleted”标志设置为 true。但是,在插入冲突时,我希望更新“复制”表和“已删除”标志。尝试使用 ON CONFLICT(id) DO UPDATE 似乎只会更新“Main”表而不适用于“Copy”表。 'isdeleted' 不是“主”表的一部分。 “主”表上的触发器是 AFTER INSERTBEFORE DELETE

有谁知道在冲突时更新另一个表的解决方法?

BEGIN
  IF (TG_OP = 'INSERT')
  THEN
    INSERT INTO copy_table (id,isdeleted)
      (
        SELECT
          new.id,
          FALSE
      )
    ON CONFLICT (id)  DO NOTHING;
   */ UPDATE copy_table         --TRYING TO MAKE THIS WORK
      SET isdeleted = FALSE
      WHERE new.sfid = sfid; */
    RETURN new;

ELSEIF (TG_OP = 'DELETE')
    THEN
      UPDATE copy_table
      SET
        isdeleted = TRUE
      WHERE old.id= id;
      RETURN old;
  END IF;
END;

最佳答案

ON CONFLICT 部分中的 UPDATE 引用与 INSERT 相同的表,以及已被拒绝的行。因此,您可以使用简单的:

  IF (TG_OP = 'INSERT')
  THEN
    INSERT INTO copy_table (id, isdeleted)
      VALUES (new.id, FALSE)
    ON CONFLICT (id) DO 
      UPDATE SET isdeleted = FALSE;
    RETURN new;
  END IF;

关于sql - Postgres 触发器函数 ON CONFLICT 更新另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46105982/

相关文章:

mysql - 为什么 MySQL 数据库中的电话号码被截断

sql - 如何在不列出列的情况下对每一列执行相同的聚合?

Laravel "Find"方法 "Where id = ?"给出错误结果

wpf - 触发器适用于 IsEnabled,但不适用于 CheckBox 中的 IsChecked

mysql - 根据另一个表值触发器设置新值

PHP + mySQLi 最后插入的 id

sql - Google BigQuery - 在 Google BigQuery SQL 中模拟 Pandas removeDuplicates()

Oracle DB - 标识符太长

mysql - 如何在 SQL 客户端中使用 'follow' 外键

sql - 带有 JOIN 元素的递归链?