我如何创建一个 Postgres 11 触发器函数,在插入或更新到 table 'a' 时在 table 'b' 中插入一个新行?

How can I create a Postgres 11 trigger function which inserts a new row in table 'b' upon insert or update to table 'a'?

我是 运行 RDS 上的 Postgres 11。
我正在尝试创建一个简单的触发器函数,以便在将行插入 table 'test_values'.

时将记录插入 table 'test_alias'

我有以下 tables:

CREATE TABLE the_schema.test_values (
    id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT now(), 
    value_1 TEXT NOT NULL, 
    value_2 TEXT NOT NULL,
    value_quantity INTEGER NOT NULL
);

CREATE TABLE the_schema.test_alias (
    id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT now(), 
    value_1_copy TEXT NOT NULL, 
    value_2_copy TEXT NOT NULL,
    value_quantity_copy INTEGER NOT NULL
);

我的触发函数是这样的:

CREATE OR REPLACE FUNCTION the_schema.populate_test_alias()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF NEW.the_schema.test_values THEN 
INSERT INTO the_schema.test_alias (value_1_copy, value_2_copy, value_quantity_copy)
VALUES (NEW.value_1, NEW.value_2, NEW.value_quantity);
END IF;
return null;
END; 
$BODY$ LANGUAGE plpgsql;

这里是触发器:

CREATE TRIGGER TRG_TEST_ALIAS 
AFTER INSERT OR UPDATE ON the_schema.test_values
FOR EACH ROW 
execute procedure the_schema.populate_test_alias();

像这样插入:

INSERT INTO the_schema.test_values (value_1, value_2, value_quantity)
VALUES ('abc', 'xyz', 1);

我收到这个错误:

ERROR:  missing FROM-clause entry for table "the_schema"
LINE 1: SELECT NEW.the_schema.test_values

我也尝试过使用默认模式进行等效设置,但它仍然出错(尽管有不同的错误):

ERROR:  record "new" has no field "test_values"
CONTEXT:  SQL statement "SELECT NEW.test_values"
PL/pgSQL function populate_test_alias() line 3 at IF

在我看来,我使用 NEW 关键字的方式肯定有错误,但据我所知,我在函数中使用它的方式与几个示例相同我已经提到了(online/SO 和硬拷贝),但我无法理解。

非常感谢所有指导!


example of similar question for reference,包括指向官方文档的链接(我也阅读过但显然不理解我应该理解的): [

NEW 引用插入或更新的行。因此 NEW. 仅对字段标识符有意义。

另外 value_1, value_2value_quantity 有一个 NOT NULL 约束,这意味着您不需要对它们进行测试。

所以你可以放弃整个条件:

CREATE OR REPLACE FUNCTION the_schema.populate_test_alias()
RETURNS TRIGGER AS
$BODY$
BEGIN
--IF NEW.the_schema.test_values THEN 
INSERT INTO the_schema.test_alias (value_1_copy, value_2_copy, value_quantity_copy)
VALUES (NEW.value_1, NEW.value_2, NEW.value_quantity);
--END IF;
return null;
END; 
$BODY$ LANGUAGE plpgsql;