本文章代码已在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自动获取当前时间并存储
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.基础表和触发器都完成后就可以尝试插入数据了,我们只插入前两列的数据uid和gid
INSERT INTO timedb VALUES(1,3);
5.最后查看一下我们插入的数据
没问题,uptime有正确的自动填入了
使用触发器可以大大减少sql代码的书写工作,提高效率,除此之外还可以用于表更新时的某些数据进行自动化修改,不过触发器的应用频率并不是特别高,该部分内容可以仅了解。
作者的话(Alvin):
本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第11章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读