sql - 仅在更新的行上更新后的 PostgreSQL 触发器

标签 sql postgresql triggers plpgsql

我有一张用于新闻的小 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();

但是当我只需要更新的行时,触发器会更新我表中的每一行(甚至那些未更新的行)。我做错了什么?

最佳答案

您的update 语句正在更新表中的所有行!它没有 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;
$$;

顺便说一句,将日期/时间存储在单独的列中对我来说毫无意义。

关于sql - 仅在更新的行上更新后的 PostgreSQL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47758596/

相关文章:

mySQL : Sort ID by a given string of ID ?(为分层数据构建面包屑)

SQL Server 2005 "FOR XML PATH"多个标签同名

postgresql - Postgres案例查询问题

database-design - 触发器与约束的性能注意事项

python - 在 Flask 应用程序中使用 sql 脚本

mysql - #1241 - 操作数应包含 1 列 IN

sql - postgres - 如何根据两个数组的 AND 填充一个新数组

sql - 为范围内的缺失值补零

mysql - 我正在使用以下 PHP 代码创建触发器但总是出错,请帮助我解决它

c# - 在触发错误中设置TextDecoration