虽然许多触发器用法涉及用户编写的触发器函数,但 PostgreSQL 提供了一些内置触发器函数,这些函数可以直接在用户定义的触发器中使用。这些函数总结在 表 9.110 中。(还存在其他内置触发器函数,它们实现了外键约束和延迟索引约束。这些不在此处文档化,因为用户不需要直接使用它们。)
有关创建触发器的更多信息,请参阅 CREATE TRIGGER。
表 9.110. 内置触发器函数
函数 描述 用法示例 |
---|
抑制无操作的更新操作。详情见下文。
|
从关联的纯文本文档列自动更新
|
从关联的纯文本文档列自动更新
|
suppress_redundant_updates_trigger
函数,当作为行级 BEFORE UPDATE
触发器应用时,将阻止任何实际上未更改行中数据的更新的发生。这会覆盖正常行为,即正常行为始终执行物理行更新,而不管数据是否已更改。(这种正常行为使更新运行更快,因为不需要检查,并且在某些情况下也很有用。)
理想情况下,您应该避免运行实际上并未更改记录中数据的更新。冗余更新可能耗费大量不必要的时间,特别是当有大量索引需要更改时,并且会产生死行空间,最终需要进行清理。但是,在客户端代码中检测这种情况并不总是容易,甚至不可能,并且编写表达式来检测它们可能容易出错。另一种方法是使用 suppress_redundant_updates_trigger
,它会跳过不更改数据的更新。但是,您应该谨慎使用它。该触发器对每条记录都需要花费少量但非微不足道的时间,因此如果受更新影响的大部分记录确实发生了更改,使用此触发器将平均使更新运行速度变慢。
可以使用以下方式将 suppress_redundant_updates_trigger
函数添加到表中
CREATE TRIGGER z_min_update BEFORE UPDATE ON tablename FOR EACH ROW EXECUTE FUNCTION suppress_redundant_updates_trigger();
在大多数情况下,您需要为每行最后触发此触发器,以便它不会覆盖其他可能希望修改行的触发器。考虑到触发器按名称顺序触发,因此您应该选择一个触发器名称,该名称应排在您可能在表上设置的任何其他触发器名称之后。(因此,示例中的 “z” 前缀。)
如果您在文档中发现任何不正确的内容、与您对特定功能的经验不符的内容或需要进一步澄清的内容,请使用 此表格 报告文档问题。