我如何创建一个 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_2
和 value_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;
我是 运行 RDS 上的 Postgres 11。
我正在尝试创建一个简单的触发器函数,以便在将行插入 table 'test_values'.
我有以下 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_2
和 value_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;