【发布时间】:2020-09-30 13:44:51
【问题描述】:
我是新手,我想了解: 我了解 New 只能通过 Insert 或 Update 执行。 旧的只有删除“如果我没记错的话”。
而我正在尝试做的是导出“如果 2 个值相同但不同的数字”,我将其插入表中并保留默认的 false 值,我做了,但“我插入”了新数据,但应该是“driver”的值“OLD”。
¿该请求能否得到满足?
触发器:
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