postgresql 触发器函数无法更新表

yrefmtwq  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(327)

下面是我的触发函数

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函数的工作原理。有什么神奇之处吗?

laik7k3q

laik7k3q1#

AFTER触发器不能更改任何内容。运行额外的UPDATE也非常低效。请将其更改为BEFORE触发器并分配所需的值:

CREATE OR REPLACE FUNCTION test_table_insert()
    RETURNS TRIGGER
AS $$
BEGIN
  IF NEW.id IS NULL THEN
    RAISE EXCEPTION 'id is null';
  END IF;
  NEW.ro_id := NEW.id;
  RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER test_table_insert 
  BEFORE INSERT ON e_sub_agreement 
  FOR EACH ROW EXECUTE PROCEDURE test_table_insert();

请注意,将列定义为NOT NULL可以更好地执行NOT NULL检查.

相关问题