【问题标题】:Postgresql Trigger Syntax Insert or Update or DeletePostgresql 触发器语法插入或更新或删除
【发布时间】:2020-09-30 13:44:51
【问题描述】:

我是新手,我想了解: 我了解 New 只能通过 Insert 或 Update 执行。 旧的只有删除“如果我没记错的话”。

而我正在尝试做的是导出“如果 2 个值相同但不同的数字”,我将其插入表中并保留默认的 false 值,我做了,但“我插入”了新数据,但应该是“driver”的值“OLD”。

¿该请求能否得到满足?

db<>fiddle

触发器:

CREATE FUNCTION TR_DRIVER() RETURNS TRIGGER
AS
$$
BEGIN

IF EXISTS(SELECT number_driver, cod_driver
        FROM driver AS con
   WHERE  EXISTS (SELECT * FROM driver_tmp AS tmp
        WHERE con.number_driver<>tmp.number_driver AND con.cod_driver=tmp.cod_driver)) THEN

INSERT INTO driver_false(number_driver, cod_driver, full_name)
    VALUES (new.number_driver, new.cod_driver, new.full_name);
ELSE

INSERT INTO driver(number_driver, cod_driver, full_name, active)
    VALUES (new.number_driver, new.cod_driver, new.full_name, new.active)
ON CONFLICT (number_driver)
DO UPDATE SET
cod_driver=excluded.cod_driver,
full_name=excluded.full_name,
active=excluded.active;

END IF;
RETURN NEW;
END $$
LANGUAGE plpgsql;

CREATE TRIGGER TR_DRIVER_TMP AFTER INSERT OR UPDATE ON driver_tmp
FOR EACH ROW
EXECUTE PROCEDURE TR_DRIVER() ;

【问题讨论】:

  • 你能用英语重述这个问题吗?我不明白。也许样本数据会有所帮助。
  • 能否将“driver_tmp”数据插入“driver”表并更新现有数据?我不明白为什么,IF 语句为我提供了“driver_false”表的新值。我想要做的是:将“driver”中存在的先前值传递给“driver_false”并将其从“driver”中删除。如何执行该 IF 语句?示例代码:dbfiddle.uk/…
  • 您正在使用AFTER TRIGGER,根据我下面的答案中的链接:“始终忽略在之后触发的行级触发器或在之前或之后触发的语句级触发器的返回值; "换句话说,您不能对返回的行进行任何更改。你需要一个BEFORE TRIGGER
  • 谢谢,我先测试一下,现在我可以在相同的条件下触发 2 个触发器吗?

标签: postgresql triggers postgresql-9.5 postgresql-10


【解决方案1】:

你误会了,OLD 也存在于 UPDATE,因为 Postgres 中的更新实际上是 INSERT/DELETE。详情见:

https://www.postgresql.org/docs/current/plpgsql-trigger.html

数据类型记录;为行级触发器中的 INSERT/UPDATE 操作保存新数据库行的变量。此变量在语句级触发器和 DELETE 操作中为空。 老

数据类型记录;保存旧数据库行的变量,用于行级触发器中的 UPDATE/DELETE 操作。此变量在语句级触发器和 INSERT 操作中为空。

【讨论】:

  • 谢谢,我会审核的。
猜你喜欢
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2015-04-08
  • 2011-05-05
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多