本文章代码已在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,有三个属性:uid、gid和uptime,其中uptime需要使用触发器timedb_updateTime在新增每条新记录时执行函数func_timedb自动获取当前时间并存储
CREATE TABLE timedb (uid INTEGER,gid INTEGER,uptime timestamp with time zone); 
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 操作后)的新行数据,
NEW 表示将要插入的新行。NEW 表示更新后的行数据。OLD: 用于引用触发器操作前(例如,UPDATE 或 DELETE 操作前)的旧行数据,
OLD 表示更新前的行数据。OLD 表示将要被删除的行数据。注意在update更新操作时是调用了内置函数NOW()来赋值给uptime,注意不要打错字,不然该问题会在后续插入数据的时候才会出现错误。

CREATE trigger timedb_updateTime AFTER INSERT ON timedb FOR EACH ROW EXECUTE PROCEDURE func_timedb(); 
INSERT INTO timedb VALUES(1,3); 
没问题,uptime有正确的自动填入了
使用触发器可以大大减少sql代码的书写工作,提高效率,除此之外还可以用于表更新时的某些数据进行自动化修改,不过触发器的应用频率并不是特别高,该部分内容可以仅了解。
作者的话(Alvin):
本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第11章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读