仅在更新的行上更新后的 PostgreSQL 触发器
PostgreSQL trigger after update only on a updated row
我有个小table求消息。我想制作一个触发器来设置行中的更新日期和更新时间(仅适用于已更新的行)
我试着做了以下:
CREATE FUNCTION add_update_dates()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF (OLD.news_name IS DISTINCT FROM NEW.news_name OR
OLD.news_description IS DISTINCT FROM NEW.news_description OR
OLD.news_text IS DISTINCT FROM NEW.news_text) THEN
UPDATE news SET news_update_date = current_date, news_update_time = current_time;
END IF;
RETURN new;
END
$$;
CREATE TRIGGER update_news_dates
AFTER UPDATE ON news
FOR EACH ROW
EXECUTE PROCEDURE add_update_dates();
但是当我只需要更新的行时,触发器会更新我的 table 中的每一行(即使是那些未更新的行)。我做错了什么?
您的 update
语句正在更新 table 中的所有行!它没有 where
子句。
只需使用赋值:
CREATE FUNCTION add_update_dates()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF (OLD.news_name IS DISTINCT FROM NEW.news_name OR
OLD.news_description IS DISTINCT FROM NEW.news_description OR
OLD.news_text IS DISTINCT FROM NEW.news_text
) THEN
NEW.news_update_date := current_date;
NEW.news_update_time := current_time;
END IF;
RETURN new;
END;
$$;
顺便说一句,将 date/time 存储在单独的列中对我来说毫无意义。
我有个小table求消息。我想制作一个触发器来设置行中的更新日期和更新时间(仅适用于已更新的行)
我试着做了以下:
CREATE FUNCTION add_update_dates()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF (OLD.news_name IS DISTINCT FROM NEW.news_name OR
OLD.news_description IS DISTINCT FROM NEW.news_description OR
OLD.news_text IS DISTINCT FROM NEW.news_text) THEN
UPDATE news SET news_update_date = current_date, news_update_time = current_time;
END IF;
RETURN new;
END
$$;
CREATE TRIGGER update_news_dates
AFTER UPDATE ON news
FOR EACH ROW
EXECUTE PROCEDURE add_update_dates();
但是当我只需要更新的行时,触发器会更新我的 table 中的每一行(即使是那些未更新的行)。我做错了什么?
您的 update
语句正在更新 table 中的所有行!它没有 where
子句。
只需使用赋值:
CREATE FUNCTION add_update_dates()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF (OLD.news_name IS DISTINCT FROM NEW.news_name OR
OLD.news_description IS DISTINCT FROM NEW.news_description OR
OLD.news_text IS DISTINCT FROM NEW.news_text
) THEN
NEW.news_update_date := current_date;
NEW.news_update_time := current_time;
END IF;
RETURN new;
END;
$$;
顺便说一句,将 date/time 存储在单独的列中对我来说毫无意义。