postgresql - pgSQL - INSERT 之前触发函数检查是否存在具有相同 id 的记录

标签 postgresql database-trigger

我有一个任务: INSERT前检查是否存在相同id的记录,设置新记录time_dead()

BEGIN
IF NEW.id = OLD.id THEN
         INSERT INTO temporary_objects(OLD.time_dead)
         value(now());
    END IF;
    RETURN NEW;
END;

这不起作用,因为 OLD 和 INSERT 不能一起工作。 但我没有看到其他选择。 谢谢。

最佳答案

您可以通过多种方式处理这种情况:

  1. 如果您在表的 id 列上定义了主键,则可以使用 INSERT 或 UPDATE: https://www.postgresql.org/docs/current/sql-insert.html
INSERT INTO temporary_objects VALUES(NEW.*) ON CONFLICT DO UPDATE SET time_dead = now();
  • 您可以将逻辑放入触发器中以查找包含 NEW.id 的行,如果 NEW.id 不存在则插入新记录,否则进行更新。如下所示:
  •    DECLARE
          id_exists INTEGER;
       BEGIN
         SELECT id INTO id_exists FROM temporary_objects WHERE id = NEW.id;
         IF NOT FOUND THEN
            INSERT INTO temporary_objects VALUES(NEW.*);
         ELSE 
             UPDATE temporary_objects SET time_dead = now() WHERE id = NEW.id;
             RETURN NEW;
         END IF;
         RETURN NEW;
    END;
    

    关于postgresql - pgSQL - INSERT 之前触发函数检查是否存在具有相同 id 的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61458007/

    相关文章:

    mysql - 如何使用触发器在插入时更改同一表的字段值(MySQL)

    此 Oracle 触发器的 MySQL 等效代码

    sql - 从函数返回的触发器如何影响 BEFORE 或 AFTER 语句?

    MySQL创建表和触发器

    database - Postgresql:遍历每个表并检查列?

    java - ‘pgp_sym_encrypt’和 ‘pgp_sym_decrypt’带有HSM(硬件安全模块)的机制

    javascript - 即使在添加 catch block 之后,nodejs 中的 "UnhandledPromiseRejectionWarning"

    sql - 何时在 SQL 插入中检查表约束?

    sql - 正则表达式仅用双引号替换第一个分号

    Sqlite:触发以限制行中的值数量