下面是我的触发函数
CREATE OR REPLACE FUNCTION test_table_insert()
RETURNS TRIGGER
AS $$
BEGIN
IF NEW.id IS NULL THEN
RAISE EXCEPTION 'id is null';
END IF;
UPDATE e_sub_agreement SET ro_id = NEW.id WHERE id = NEW.id;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER test_table_insert AFTER INSERT ON e_sub_agreement FOR EACH ROW EXECUTE PROCEDURE test_table_insert();
问题是它没有更新表e_sub_agreement。我检查了NEW值,一切正常。它返回新的id。如果我更改where语句id =“some existing id in table”,那么它就起作用了。它将ro_id更改为新的id。这怎么可能呢?我的猜测是,数据还没有插入到表中,触发器函数找不到具有给定id的行。但是它“这不是触发器的after insert函数的工作原理。有什么神奇之处吗?
1条答案
按热度按时间laik7k3q1#
AFTER触发器不能更改任何内容。运行额外的UPDATE也非常低效。请将其更改为BEFORE触发器并分配所需的值:
请注意,将列定义为NOT NULL可以更好地执行NOT NULL检查.