如何用标准SQL改写PostgreSQL中更新当前日期的触发器?
将PostgreSQL更新时间触发器改写为标准SQL版本
问题背景
十年前StackOverflow上一则关于PostgreSQL更新当前日期触发器的回答对我有所帮助,但我无法写出等价的标准SQL函数和触发器——即language参数指定为sql而非plpgsql的版本。问题在于标准SQL编写的函数无法返回trigger类型,而PostgreSQL要求触发器函数必须声明为无参数且返回trigger类型:
触发器函数必须声明为无参数且返回trigger类型。
尝试执行以下代码:
create function func_dummy() returns trigger as 'update tbl_dummy set update_date = current_timestamp;' language sql;
得到报错:
ERROR: SQL functions cannot return type trigger SQL state: 42P13
解决方案
标准SQL的触发器体系不需要单独定义返回trigger类型的函数,可以直接在触发器定义中嵌入字段更新逻辑,完全绕过PostgreSQL的SQL函数限制。
标准SQL实现代码
直接创建BEFORE UPDATE触发器,在触发时自动更新目标字段:
CREATE TRIGGER trigger_dummy_update_date BEFORE UPDATE ON tbl_dummy FOR EACH ROW SET update_date = CURRENT_TIMESTAMP;
核心说明
- 该写法严格遵循SQL标准,无需依赖PostgreSQL特有的PL/pgSQL或SQL函数。
- 触发器会在每一行数据执行更新操作前,自动将
update_date字段设为当前时间戳,实现与原PostgreSQL触发器完全一致的效果。
内容的提问来源于stack exchange,提问作者Geolographist
相关产品推荐
相关产品推荐

