PostgreSQL11 | 触发器
创始人
2024-11-14 00:33:52

本文章代码已在pgsql11.22版本上运行且通过,展示页由pgAdmin8.4版本提供

上一篇总结了原著的第十章有关pgsql的视图的用法,本篇将总结pgsql的触发器的用法。

触发器

        使用触发器可以自动化完成一些在插入数据或修改数据时,某些需要同期同步的数据的工作。例如,期望在进行增加新一行数据时,把插入时的“插入时间”进行同步的功能,在我进行sql代码编写时,因为已经提早就做好了触发器,我只需要填充其他所需的数据,不用再去写“插入时间”这一列的数据。

        触发器可以定义在一个INSERT、UPDATE或DALETE命令之前或之后执行

        所谓触发器函数,就是一个无参并返回一个trigger类型的函数,用于触发器来执行任务的函数,所以在创建触发器前,要先创建一个触发器函数。

书写格式

触发器函数创建格式:

CREATE FUNCTION 函数名() RETURNS trigger as $函数名$ 	BEGIN  		函数执行代码; 	end; $函数名$ LANGUAGE plpgsql;

然后再创建触发器,用于pgsql在用户执行某一个指定的操作时,自动激活触发器完成任务

触发器创建格式:

CREATE trigger 触发器名 BEFORE|AFTER 触发事件【INSERT|UPDATE|DELETE】 ON 表名 FOR EACH ROW EXECUTE PROCEDURE 触发器函数名();

BEFORE:在触发事件之前先完成函数动作,然后再执行触发事件本身

AFTER:在触发事件之后再完成函数动作

使用案例

 我们需要创建一个表timedb,有三个属性:uidgiduptime,其中uptime需要使用触发器timedb_updateTime在新增每条新记录时执行函数func_timedb自动获取当前时间并存储

1.先创建这张基础表timedb

CREATE TABLE timedb (uid INTEGER,gid INTEGER,uptime timestamp with time zone);

2.创建触发器函数

CREATE FUNCTION func_timedb() RETURNS trigger as $func_timedb$ 	BEGIN  		if(TG_OP='UPTIME')then 			if NEW.uptime=OLD.uptime then 				return null; 			end if; 		end if; 		update timedb set uptime = NOW() where uid = NEW.uid and gid=New.gid; 		return null; 	end; $func_timedb$ LANGUAGE plpgsql;

这里说明一下代码中的NEW和OLD,这两个关键字在触发器中有不同的用法

NEW:用于引用触发器操作后(例如,INSERT 或 UPDATE 操作后)的新行数据,

  • 在 INSERT 触发器中,NEW 表示将要插入的新行。
  • 在 UPDATE 触发器中,NEW 表示更新后的行数据。

OLD: 用于引用触发器操作前(例如,UPDATE 或 DELETE 操作前)的旧行数据,

  • 在 UPDATE 触发器中,OLD 表示更新前的行数据。
  • 在 DELETE 触发器中,OLD 表示将要被删除的行数据。

注意在update更新操作时是调用了内置函数NOW()来赋值给uptime,注意不要打错字,不然该问题会在后续插入数据的时候才会出现错误。

3.创建触发器

CREATE trigger timedb_updateTime AFTER INSERT ON timedb FOR EACH ROW EXECUTE PROCEDURE func_timedb();

 

4.基础表和触发器都完成后就可以尝试插入数据了,我们只插入前两列的数据uidgid

INSERT INTO timedb VALUES(1,3);

5.最后查看一下我们插入的数据

没问题,uptime有正确的自动填入了 

使用触发器可以大大减少sql代码的书写工作,提高效率,除此之外还可以用于表更新时的某些数据进行自动化修改,不过触发器的应用频率并不是特别高,该部分内容可以仅了解。

作者的话(Alvin):

        本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第11章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...