PostgreSQL11 | 触发器

news2024/12/24 9:07:37

本文章代码已在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方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vulnhub】Depth靶机

靶机安装 下载地址:https://download.vulnhub.com/depth/DepthB2R.ova 运行环境:VMware运行该虚拟机 信息收集 靶机IP发现 nmap 192.168.93.0/24 端口扫描 nmap -A 192.168.93.154 -p- 只开起了8080端口 进行目录扫描8080端口 dirsearch -u http…

学习记录(9):Prompt提示词技巧

依旧照例先感谢前辈们的慷慨分享 今天学习的是这篇文章↓ 原文:转自公主号“博金斯的AI笔记” —《4篇Prompt论文的提示词技巧, 3 个 GPTs 实例测试》 文章目录 一、提示词框架二、逻辑链(Chain of thought)三、思维树(Tree of th…

华为Atlas 500 智能小站+鸿蒙AI大算力边缘计算解决方案

Atlas 500 智能小站鸿蒙大算力解决方案 技术规格 表3-1 技术规格 项目 说明 处理器 海思Hi3559A处理器 双核ARM Cortex A731.6GHz,32KB I-Cache,64KB D-Cache /512KB L2 cache双核ARM Cortex A531.2GHz,32KB I-Cache,32KB D-C…

如何确保PLC系统安全的可靠性,这几个注意事项你需要牢记

PLC(可编程逻辑控制器)是现代工业自动化系统中的关键组成部分。在设计 PLC 系统时,安全性是至关重要的考虑因素。本文将介绍 PLC 系统设计中的一些安全注意事项,包括电源设计、接地设计、关键数字量输入输出设计和报警设计。 一.…

阿一网络安全学院之绕过CDN发现服务器真实IP

方法一: 探测次级域名 方法二: 访问文件 使用访问错误目录获得报错信息成功 方法三: 去掉 www 查询 方法四: 使用网络测绘搜索引擎查询 和方法二获得的 IP 一样 方法五: 使用外国节点查询: 用了无数…

关于使用php的mpdf插件遇到的一些问题

一.插件版本 "mpdf/mpdf": "^8.0", 二.报错&#xff1a;Undefined index: list_style_type 这个是插件无法识别 li 标签导致&#xff0c;生成pdf是加入下面代码 <style> li { list-style-type: none; list-style-image: none; list-style-positi…

HTML-03.新浪新闻-标题-样式2

1.<span>标签 <span>是一个在开发网页时大量使用的没有语义的布局标签 特点&#xff1a;一行可以显示多个&#xff08;行内组合元素&#xff09;&#xff0c;宽度和高度默认由内容撑开 2.CSS选择器 2.1 元素选择器&#xff1a;标签名{...} 元素名称{ color:red; }…

如何在 Debian 上安装运行极狐GitLab Runner?【一】

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

04-Fastjson反序列化漏洞

免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…

ShardingSphere实战(5)- 读写分离

上篇博客&#xff0c;我们讲了 ShardingSphere实战&#xff08;4&#xff09;- 广播表和默认数据源 &#xff0c;这篇博客&#xff0c;我们实现一下读写分离。 一、读写分离配置 # sharding-jdbc 读写分离策略 # 给数据源起别名&#xff0c;这里名称需要和下面的一致 spring.…

【C++标准模版库】vector的介绍及使用

vector 一.vector的介绍二.vector的使用1.vector 构造函数2.vector 空间增长3.vector 增删查改4.vector 迭代器的使用1.正向迭代器2.反向迭代器 5.victor 迭代器失效问题&#xff08;重点&#xff09; 三.vector不支持 流提取与流插入四.vector存储自定义类型1.存储string2.存储…

OS_操作系统的运行环境

2024.06.11:操作系统的运行环境学习笔记 第3节 操作系统的运行环境 3.1 操作系统引导3.2 操作系统内核3.2.1 内核资源管理3.2.2 内核基本功能 3.3 CPU的双重工作模式3.3.1 CPU处于用户态&#xff08;目态&#xff09;3.3.2 CPU处于内核态&#xff08;管态&#xff09; 3.4 特权…

【mars3d】创建一个全黑的地球,太空背景色随意

关键参数&#xff1a; 1.backgroundColor 2.baseColor 3.basemaps 在basemaps没有底图的时候&#xff0c;可以直接设置地球的背景色baseColor 与此同时需要注意&#xff0c;不要showSkyBox等天空盒效果&#xff0c;不然容易看不见球在哪里&#xff0c;不好操作 链接&…

一种用于用于图像超分辨率的高效退化模型

一种用于用于图像超分辨率的高效退化模型 摘要引言退化模型设计图像降质模型简化版3.1. 模糊3.2. 下采样3.3. 噪声3.4. 随机排序 实验结果结论参考文献 摘要 为了增加数原始图像的退化丰富度&#xff0c;提高超分辨率网络的泛化能力&#xff0c;本文介绍了一种更加复杂但实用的…

秒懂C++之vector(下)

目录 前言 一.vector容器的模拟实现 1.1 基本配置 1.2 reserve 扩容 1.3 push_back 尾插 1.4 insert 插入 1.5 【】运算符 1.6 拷贝构造 1.7 运算符 1.8 resize 扩容初始化 1.9 erase 删除 1.10 迭代器构造 二.例题练习 17. 电话号码的字母组合 题目解析&#x…

pytorch学习笔记3 tensor索引和切片

dim 0 占先 切片 &#xff08;前N或者后N个&#xff09; &#xff1a;2 表示 0到2&#xff08;不包含2&#xff09;&#xff0c; 1&#xff1a;表示 1到末尾&#xff0c; -1表示最后一个元素&#xff0c;-2表示倒数第二个 0:28:2 表示从0到27隔点采样 &#xff1a;&#xff…

【反序列化漏洞】serial靶机详解

一、安装靶机 首先创建新的虚拟机。 然后选择客户机版本为Ubuntu 64位。 然后选择使用现有磁盘&#xff0c;选择下载的vmdk磁盘文件即可。剩下的都是默认 二、信息收集 发现主机192.168.204.143 访问 扫描端口nmap -A 192.168.204.143 -p-&#xff0c;发现只有ssh:22和http:8…

科普文:微服务之分布式链路追踪SkyWalking单点服务搭建

1. 概述 1.1 概念 SkyWalking 是什么&#xff1f; SkyWalking 极简入门 | Apache SkyWalking FROM Apache SkyWalking 分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架构而设计。 提供分布式追…

【Bugku】Web系列第二更~

1.你必须让他停下 查看源代码&#xff0c;一直刷新&#xff0c;直到看见flag 2.矛盾 构造一个?num1[字母&#xff0c;随便写到最后都会被PHP转化成0] 这里利用的是PHP对数字和字符串比较的时候的一个特性&#xff0c;他会试图把字符串转化为数字&#xff0c;所以1XXX转化到最后…

学习笔记 - 二极管的参数与选型

二极管 普通二极管&#xff1a; 1N4148(高频开关二极管) 整流二极管&#xff1a; 1N4007 1A 1000V1N5408 3A 1000V 肖特基二极管 &#xff08;白线边为阴极&#xff09; SS14 SS34 SS54 常见肖特基二极管参数 快恢复二极管 FR107 FR207 FR307 UF4007 可以用快恢复二…