pgSQL - INSERT 之前的触发函数检查是否存在具有相同 ID 的记录
pgSQL - trigger function before INSERT check if record with same id exists
我有一个任务:
在 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 不能一起工作。
但我看不到替代方案。
谢谢。
您可以通过几种方式处理这种情况:
- 如果您在 table 的 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;
我有一个任务: 在 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 不能一起工作。 但我看不到替代方案。 谢谢。
您可以通过几种方式处理这种情况:
- 如果您在 table 的 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;