Postgresql触发器语法插入或更新或删除

问题描述

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

我想做的是推导“如果2个值相同但不同的数字”,我将其插入表中并保留认的false值,但是我做了,但是“我插入”了新数据,但应为“驱动程序”的值“ 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,full_name,active)
    VALUES (new.number_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() ;

解决方法

您错了,UPDATE也存在OLD,因为Postgres中的更新实际上是INSERT/DELETE。有关详细信息,请参见:

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...