gpt4 book ai didi

postgresql - 不递归更新触发器中的行

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

我有两个表:

CREATE TABLE first (
id text primary key,
updated_at timestamp,
data text
);

CREATE TABLE second (
id text REFERENCES first (id),
book_error text,
);

并且当这些表中的任何一个更新时,我需要始终更新第一个表中的 updated_at 字段。我是这样写的:

CREATE FUNCTION update_timestamp() RETURNS trigger AS $$
BEGIN
UPDATE first
SET updated_at = current_timestamp
WHERE id = NEW.id;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;

DO $$
DECLARE
t text;
BEGIN
FOR t IN
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public'
LOOP
EXECUTE format('CREATE TRIGGER update_timestamp
BEFORE INSERT OR UPDATE ON %I
FOR EACH ROW EXECUTE PROCEDURE update_timestamp()',
t);
END LOOP;
END;
$$ LANGUAGE plpgsql;

但它不起作用,因为我的触发器中的更新语句导致在执行之前再次调用此触发器。
如何在不再次触发触发器的情况下在触发器内部进行更新?

最佳答案

根据 the documentation:

TG_TABLE_NAME

Data type name; the name of the table that caused the trigger invocation.

在触发函数中使用变量:

CREATE OR REPLACE FUNCTION update_timestamp() RETURNS trigger AS $$
BEGIN
IF TG_TABLE_NAME = 'first' THEN
NEW.updated_at = current_timestamp;
ELSE
UPDATE first
SET updated_at = current_timestamp
WHERE id = NEW.id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

关于postgresql - 不递归更新触发器中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047444/

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