gpt4 book ai didi

sql - 如何创建 Postgres 11 触发器函数,该函数在插入或更新表 'b' 时在表 'a' 中插入新行?

转载 作者:行者123 更新时间:2023-12-04 08:09:50 25 4
gpt4 key购买 nike

我在 RDS 上运行 Postgres 11。
我正在尝试创建一个简单的触发器函数,以便在将行插入表 'test_values' 时将记录插入表 'test_alias'。
我有以下表格:

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 关键字的方式一定有错误,但据我所知,我在函数中使用它的方式与我提到的几个例子相同(在线/SO 和硬拷贝),我无法弄清楚。
非常感谢所有指导!

供引用的类似问题的示例,包括指向官方文档的链接(我也阅读过,但显然我不明白):
[https://stackoverflow.com/questions/11001118/postgres-trigger-after-insert-accessing-new]

最佳答案

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;

关于sql - 如何创建 Postgres 11 触发器函数,该函数在插入或更新表 'b' 时在表 'a' 中插入新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66037451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com