PostgreSql创建触发器并增加IF判断条件

在这里插入图片描述

在 PostgreSQL 中,可以使用触发器(Trigger)来在表上定义自定义的插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的行为。触发器是与表相关联的特殊函数,它们在指定的操作发生时自动执行。

PostgreSQL创建触发器的语法

创建触发器
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
[FOR EACH ROW]
[WHEN (condition)]
EXECUTE FUNCTION function_name();
  • trigger_name:触发器的名称。
  • BEFOREAFTER:指定触发器在操作之前或之后执行。
  • INSERTUPDATEDELETE:指定触发器与哪种操作相关联。
  • table_name:触发器所属的表名。
  • FOR EACH ROW:指定触发器为每一行执行。
  • WHEN (condition):可选项,指定触发器执行的条件。
  • EXECUTE FUNCTION function_name():指定触发器执行的函数。
创建触发器函数
CREATE FUNCTION function_name()
RETURNS TRIGGER AS $$
BEGIN-- 触发器的逻辑代码RETURN NEW; -- RETURN OLD; 或 RETURN NULL;
END;
$$ LANGUAGE plpgsql;
  • function_name:触发器函数的名称。
  • RETURNS TRIGGER:指定函数返回一个触发器对象。
  • $$ 是一种用于定义多行字符串的语法,用于将函数体中的代码块括起来,以便将多行代码作为一个字符串传递给 CREATE FUNCTION 语句。
  • BEGINEND:定义函数的代码块。
  • RETURN NEW;:在 BEFORE INSERTBEFORE UPDATE 触发器中,返回 NEW 表示修改后的行数据。
  • RETURN OLD;:在 AFTER UPDATEAFTER DELETEE 触发器中,返回 OLD 表示修改前的行数据。
  • RETURN NULL;:在 AFTER INSERTAFTER DELETE 触发器中,返回 NULL
删除触发器
DROP TRIGGER trigger_name ON table_name;
  • trigger_name:要删除的触发器的名称。
  • table_name:触发器所属的表名。

PostgreSQL创建触发器的案例

创建一张学生表
CREATE TABLE "public"."student" ("student_id" int4 NOT NULL DEFAULT nextval('student_student_id_seq'::regclass),"name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,"age" int4 NOT NULL,"gender" varchar(10) COLLATE "pg_catalog"."default" NOT NULL,"address" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,"phone" varchar(20) COLLATE "pg_catalog"."default" NOT NULL,"grade" varchar(20) COLLATE "pg_catalog"."default" NOT NULL,CONSTRAINT "student_pkey" PRIMARY KEY ("student_id")
);ALTER TABLE "public"."student" OWNER TO "postgres";
COMMENT ON COLUMN "public"."student"."student_id" IS '学生id';
COMMENT ON COLUMN "public"."student"."name" IS '姓名';
COMMENT ON COLUMN "public"."student"."age" IS '年龄';
COMMENT ON COLUMN "public"."student"."gender" IS '性别';
COMMENT ON COLUMN "public"."student"."address" IS '地址';
COMMENT ON COLUMN "public"."student"."phone" IS '电话';
COMMENT ON COLUMN "public"."student"."grade" IS '年级';
创建触发器要求

student表地址addressBeijing的学生,写入到一张新的student_beijing表中,同步新增修改和删除。

CREATE TABLE "public"."student_beijing" ("student_id" int4 NOT NULL DEFAULT nextval('student_student_id_seq'::regclass),"name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,"age" int4 NOT NULL,"gender" varchar(10) COLLATE "pg_catalog"."default" NOT NULL,"address" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,"phone" varchar(20) COLLATE "pg_catalog"."default" NOT NULL,"grade" varchar(20) COLLATE "pg_catalog"."default" NOT NULL,CONSTRAINT "student_beijing_pkey" PRIMARY KEY ("student_id")
);ALTER TABLE "public"."student_beijing" OWNER TO "postgres";
COMMENT ON COLUMN "public"."student_beijing"."student_id" IS '学生id';
COMMENT ON COLUMN "public"."student_beijing"."name" IS '姓名';
COMMENT ON COLUMN "public"."student_beijing"."age" IS '年龄';
COMMENT ON COLUMN "public"."student_beijing"."gender" IS '性别';
COMMENT ON COLUMN "public"."student_beijing"."address" IS '地址';
COMMENT ON COLUMN "public"."student_beijing"."phone" IS '电话';
COMMENT ON COLUMN "public"."student_beijing"."grade" IS '年级';
创建新增触发器
# 创建触发器函数
CREATE OR REPLACE FUNCTION student_insert_function() RETURNS TRIGGER AS $student_table$  BEGIN IF 'Beijing' = new.address THENINSERT INTO student_beijing (student_id,name,age,gender,address,phone,grade) VALUES (new.student_id,new.name,new.age,new.gender,new.address,new.phone,new.grade);END IF;RETURN NEW;   END;  
$student_table$ LANGUAGE plpgsql;# 创建新增触发器
CREATE TRIGGER student_insert_trigger AFTER INSERT ON student  
FOR EACH ROW EXECUTE PROCEDURE student_insert_function();# 删除触发器
DROP TRIGGER IF EXISTS student_insert_trigger ON student;
# 删除函数
DROP FUNCTION student_insert_function();
创建修改触发器
# 创建触发器函数
CREATE OR REPLACE FUNCTION student_update_function() RETURNS TRIGGER AS $student_table$  BEGIN IF 'Beijing' = new.address THENUPDATE student_beijing SET name = new.name,age = new.age,gender = new.gender,address = new.address,phone = new.phone,grade = new.grade WHERE student_id = old.student_id;END IF;RETURN NEW;   END;  
$student_table$ LANGUAGE plpgsql;# 创建修改触发器
CREATE TRIGGER student_update_trigger AFTER UPDATE ON student  
FOR EACH ROW EXECUTE PROCEDURE student_update_function();# 删除触发器
DROP TRIGGER IF EXISTS student_update_trigger ON student;
# 删除函数
DROP FUNCTION student_update_function();
创建删除触发器
# 创建触发器函数
CREATE OR REPLACE FUNCTION student_delete_function() RETURNS TRIGGER AS $student_table$  BEGIN IF 'Beijing' = old.address THENDELETE FROM student_beijing WHERE student_id = old.student_id;END IF;RETURN OLD;   END;  
$student_table$ LANGUAGE plpgsql;# 创建删除触发器
CREATE TRIGGER student_delete_trigger AFTER DELETE ON student  
FOR EACH ROW EXECUTE PROCEDURE student_delete_function();# 删除触发器
DROP TRIGGER IF EXISTS student_delete_trigger ON student;
# 删除函数
DROP FUNCTION student_delete_function();

测试触发器

student表新增数据
INSERT INTO student ("student_id", "name", "age", "gender", "address", "phone", "grade") VALUES (4, 'John Doe', 18, 'Male', 'Beijing', '1234567890', 'Grade 10');
student表修改数据
UPDATE student SET "name" = 'John Doe', "age" = 18, "gender" = 'Male', "address" = 'Beijing', "phone" = '1234567890', "grade" = 'Grade 11' WHERE "student_id" = 4;
student表删除数据
DELETE FROM student WHERE student_id = 4;

PostgreSQL使用触发器的优缺点

触发器的优点
  1. 数据完整性:触发器可以用于实施数据完整性约束,例如在插入或更新数据之前进行验证。
  2. 自动化操作:触发器可以自动执行一系列操作,无需手动干预。这可以提高开发效率并减少人为错误。
  3. 数据一致性:通过触发器,可以确保数据库中的数据保持一致性,例如在更新操作时自动更新相关字段。
  4. 日志记录:触发器可以用于记录数据库中的操作,例如在插入、更新或删除数据时记录相关信息。
触发器的缺点
  1. 复杂性:触发器的创建和管理可能会增加数据库的复杂性。触发器的逻辑必须正确且易于理解,以避免潜在的错误和混乱。
  2. 性能影响:触发器的执行会增加数据库的负载,特别是在处理大量数据时。过多或复杂的触发器可能会导致性能下降。
  3. 隐式操作:触发器的存在可能会导致一些隐式的操作,这可能会使代码更难以理解和维护。开发人员需要注意触发器的存在,并确保其行为符合预期。

在使用触发器时,需要权衡其优点和缺点,并根据具体情况进行决策。触发器应该被谨慎使用,仅在确实需要自动化操作或确保数据完整性时使用。

PostgreSQL创建触发器BEGIN和END之间可以写什么样的语句

  1. SQL 查询语句:可以在触发器中执行 SELECT 语句来获取数据或进行计算。
  2. 数据操作语句:可以在触发器中执行 INSERT、UPDATE 或 DELETE 语句来修改数据。
  3. 变量声明和赋值语句:可以在触发器中声明变量,并使用赋值语句给变量赋值。
  4. 控制流语句:可以在触发器中使用 IF、CASE、LOOP 等控制流语句来实现条件逻辑。
  5. 函数调用语句:可以在触发器中调用自定义函数或内置函数来实现特定的逻辑。
  6. 异常处理语句:可以在触发器中使用异常处理语句来处理可能发生的异常情况。
  7. 其他 SQL 语句:可以在触发器中使用其他合法的 SQL 语句来满足特定需求。

需要注意的是,在触发器中执行的语句应该符合 PostgreSQL 的语法规范,并且要注意触发器的执行时机和触发条件,以避免出现不必要的问题。

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

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

相关文章

MybatisPlusException: Error: Method queryTotal execution error of sql 的报错解决

项目场景: 相关背景: 开发环境 开发系统时 系统页面加载正常 ,发布运行环境后运行一段时间,前端页面 突然出现 报错信息, 报错信息如下: MybatisPlusException: Error: Method queryTotal execution erro…

Leetcode 2011. 执行操作后的变量值

问题描述: 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言: X 和 X 使变量 X 的值 加 1--X 和 X-- 使变量 X 的值 减 1 最初,X 的值是 0 给你一个字符串数组 operations ,这是由操作组成的一个列表,返回执行所有…

Spring后端框架复习总结

之前写的博客太杂,最近想把后端框架的知识点再系统的过一遍,主要是Spring Boot和Mybatis相关,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点可以参考之前写java后端专栏,这篇不再赘述。 目录 Spring什么是AOP?底层原理?事务…

数学建模(1)

论文:做流程图 论文查重不能高于30% 论文 分模块备战 摘要不能超过一页的四分之三 数学建模的六个步骤: 【写作】---学术语言 团队练题

小阿轩yx-高性能内存对象缓存

小阿轩yx-高性能内存对象缓存 案例分析 案例概述 Memcached 是一款开源的高性能分布式内存对象缓存系统用于很多网站提高访问速度,尤其是需要频繁访问数据的大型网站是典型的 C/S 架构,需要构建 Memcached 服务器端与 Memcached API 客户端用 C 语言…

第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025)

#先投稿,先送审# 第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025) 2025 4th International Conference on Cyber Security, Artificial Intelligence and Digital Economy 重要信息 会议官网:www.csaide.net 会…

【 FPGA 线下免费体验馆】高端 AMD- xilinx 16 nm UltraScale +系列

在复杂的FPGA 开发的过程中,需要能够满足高速、高精度、多通道等的复杂应用。而一个简单的 FPGA 开发板是不具备这些的,因此需要用更高端,大容量,高速IO的 FPGA 芯片与其他硬件组成一个完整的系统开发。这里就产生了高端 FPGA 开发…

Docker搭建Harbor

1.什么是Harbor Harbor 是 vMware 公司开源的企业级 Docker 〖egistry 项日,其日标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理UI 、基于角色的访问控制(Role Based Accesscontr…

Web开发:ASP.NET CORE前后端交互之AJAX(含基础Demo)

目录 一、后端 二、前端 三、代码位置 四、实现效果 五、关键的点 1.后端传输给前端: 2.前端传输给后端 一、后端 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using WebAppl…

MongoDB教程(十二):MongoDB数据库索引

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MongoD…

uni-app学习HBuilderX学习-微信开发者工具配置

HBuilderX官网:简介 - HBuilderX 文档 (dcloud.net.cn)https://hx.dcloud.net.cn/ uni-app官网: uni-app官网 (dcloud.net.cn)https://uniapp.dcloud.net.cn/quickstart-hx.htmlHBuilder下载安装:打开官网 uni-app项目的微信开发者工具配置…

人工智能正在影响无源和互连设计

人工智能 (AI) 应用通常涉及大型数据集。工作负载可能需要多个分布式 CPU 和 GPU 实时相互通信。这是高性能计算 (HPC) 架构的本质。 在处理元件之间路由高速数字信号引入了芯片到电路板和电路板到电路板的连接。通信协议和物理标准已经开发出来以满足高速要求,通常…

基于X86+FPGA+AI的远程医疗系统,支持12/13代 Intel Core处理器

工控主板:支持12/13代 Intel Core处理器,适用于远程医疗系统 顺应数字化、网络化、智能化发展趋势,国内医疗产业改革正在积极推进,远程医疗、智慧医疗等新模式新业态创新发展和应用,市场空间不断扩大,而基…

界面控件DevExpress Blazor UI v24.1 - 发布全新TreeList组件

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生Blazor UI组件(包括Pivot Grid、调度程序、图表、数据编辑器和报表等)。 DevExpress Blazor控件目前已经升级…

园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现

随着现代园区规模的不断扩大与功能的日益复杂,传统的二维地图导航已难以满足访客高效、精准定位的需求。园区内部错综复杂的布局、频繁变更的商户位置常常让访客感到迷茫,造成寻路上的时间浪费。园区AR导航系统以创新的技术手段,破解了私域地…

【Apache Doris】周FAQ集锦:第 16 期

【Apache Doris】周FAQ集锦:第 16 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户…

Linux网络——套接字与UdpServer

目录 一、socket 编程接口 1.1 sockaddr 结构 1.2 socket 常见API 二、封装 InetAddr 三、网络字节序 四、封装通用 UdpServer 服务端 4.1 整体框架 4.2 类的初始化 4.2.1 socket 4.2.2 bind 4.2.3 创建流式套接字 4.2.4 填充结构体 4.3 服务器的运行 4.3.1 rec…

ROS2从入门到精通2-3:机器人3D物理仿真Gazebo与案例分析

目录 0 专栏介绍1 什么是Gazebo?2 Gazebo架构2.1 Gazebo前后端2.2 Gazebo文件格式2.3 Gazebo环境变量 3 Gazebo安装与基本界面4 搭建自己的地图4.1 编辑地图4.2 保存地图4.3 加载地图 5 常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底…

车载通信与DDS标准解读系列(5):DDS-Security

DDS-Security协议与DDS协议、DDSI-RTPS协议、DDS-XTypes协议共同作为DDS协议簇中的核心协议。本协议基于其它三份核心协议,对系统中各交互环节的认证加密等措施进行规范化,保障用户发现和数据传递的安全性。协议于2016年发布v1.0,目前最新版本…

香橙派AIpro-携手华为-为AI赋能

文章目录 香橙派AIpro-携手华为-为AI赋能开箱和功能介绍开箱功能介绍 环境搭建镜像烧录进入系统 测试项目YOLOv5部署YOLOv5识别单张图片实时识别视频使用Ascend测试yolov5 产品评价 香橙派AIpro-携手华为-为AI赋能 今天新入手了一款香橙派AIPro,让我们一起跟着文章…