gpt4 book ai didi

postgresql - 将 TG_TABLE_NAME 解释为更新其他表中行的值

转载 作者:行者123 更新时间:2023-11-29 14:30:19 25 4
gpt4 key购买 nike

每当更新某些其他表时,我想用最新的时间戳更新 master_table_info 表中的一行。表中的每一行对应于另一个表。我已经创建了这个函数,但我无法将 TG_TABLE_NAME 解释为变量值而不是新列。因此我得到错误 column some_table does not exist。我如何将其解释为一个值?

CREATE OR REPLACE FUNCTION master_table_timestamp()
RETURNS TRIGGER AS
$$
BEGIN
EXECUTE format('
UPDATE master_table_info
SET updated_at = NOW()
WHERE table_name = %I', TG_TABLE_NAME);
RETURN NULL;
END;
$$
language plpgsql;

CREATE TRIGGER master_table_timestamp
BEFORE UPDATE ON some_table
EXECUTE PROCEDURE master_table_timestamp();

编辑

根据目前的回答/评论和阅读触发器文档,我意识到我应该使用 TG_TABLE_NAME 并更改为 AFTER 触发器。但是,使用触发器修改表不会对 master_table_info 产生任何更改。有什么问题吗?

CREATE OR REPLACE FUNCTION master_table_timestamp()
RETURNS TRIGGER AS
$$
BEGIN
UPDATE master_table_info
SET updated_at = NOW()
WHERE table_name = TG_TABLE_NAME;
RETURN new;
END;
$$
language plpgsql;

CREATE TRIGGER master_table_timestamp
AFTER UPDATE ON some_table
EXECUTE PROCEDURE master_table_timestamp();

第二次编辑

我在上面编辑的这段代码(基于答案的帮助)是正确的。我只需要强制手动刷新表格以使其正确显示。

最佳答案

%I 将占位符替换为标识符。所以生成的 SQL 将是

UPDATE master_table_info
SET updated_at = NOW()
WHERE table_name = some_table;

要替换文字值,您需要将 %L 作为字符串中的占位符。 %L 占位符负责正确引用值,因此如果您使用它,生成的字符串将是:

UPDATE master_table_info
SET updated_at = NOW()
WHERE table_name = 'some_table';

这是你所期望的。


然而,不需要动态 SQL 开始。当您在 before 触发器中使用该函数时,从中返回一个非空值很重要,否则 UPDATE 语句将被取消。

CREATE OR REPLACE FUNCTION master_table_timestamp()
RETURNS TRIGGER AS
$$
BEGIN
UPDATE master_table_info
SET updated_at = NOW()
WHERE table_name = TG_TABLE_NAME;

RETURN new; --<< return a NON-NULL value here!
END;
$$
language plpgsql;

关于postgresql - 将 TG_TABLE_NAME 解释为更新其他表中行的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52874079/

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