SQL触发器

2023-11-09

触发器:
  • 触发器是与表有关的数据库对象,可以在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句。
  • 触发器的这种特性可以协助应用在数据库端确保数据的完整性 、日志记录 、数据校验等操作 。
  • 使用别名 NEW 和 OLD 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。
触发器类型 OLD的含义 NEW的含义
INSERT 型触发器 无 (因为插入前状态无数据) NEW 表示将要或者已经新增的数据
UPDATE 型触发器 OLD 表示修改之前的数据 NEW 表示将要或已经修改后的数据
DELETE 型触发器 OLD 表示将要或者已经删除的数据 无 (因为删除后状态无数据)
创建触发器:

语法:

/*
BEFORE:操作之前
AFTER:操作之后
INSERT|UPDATE|DELETE:选择触发器类型
*/
DELIMITER $

CREATE TRIGGER 触发器名称
BEFORE|AFTER INSERT|UPDATE|DELETE
ON 表名
[FOR EACH ROW]  -- 行级触发器
BEGIN
	触发器要执行的功能;
END$

DELIMITER ;

通过触发器记录账户表的数据变更日志。包含:增加、修改、删除

准备数据

-- 创建账户表account
CREATE TABLE account(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 账户id
	NAME VARCHAR(20),					-- 姓名
	money DOUBLE						-- 余额
);
-- 添加数据
INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',2000);

-- 创建日志表account_log
CREATE TABLE account_log(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 日志id
	operation VARCHAR(20),				-- 操作类型 (insert update delete)
	operation_time DATETIME,			-- 操作时间
	operation_id INT,					-- 操作表的id
	operation_params VARCHAR(200)       -- 操作参数
);

创建INSERT触发器

-- 创建INSERT触发器
DELIMITER $

CREATE TRIGGER account_insert
AFTER INSERT
ON account
FOR EACH ROW
BEGIN-- NOW():获取当前时间   new.id:获取新增之后的id值   CONCAT:字符串拼接
	INSERT INTO account_log
	VALUES
		(
			NULL,
			'INSERT',
			NOW(),
			new.id,
		CONCAT( '插入后{id=', new.id, ',name=', new.NAME, ',money=', new.money, '}' ));
END$

DELIMITER ;

-- 向account表添加记录
INSERT INTO account VALUES (NULL,'王五',3000);

-- 查询account表
SELECT * FROM account;

-- 查询日志表
SELECT * FROM account_log;

创建UPDATE触发器

-- 创建UPDATE触发器
DELIMITER $

CREATE TRIGGER account_update
AFTER UPDATE
ON account
FOR EACH ROW
BEGIN
	INSERT INTO account_log
	VALUES (NULL,'UPDATE',NOW(),
	new.id,CONCAT
	('修改前{id=',old.id,',name=',old.name,',money=',old.money,'}',
	'修改后{id=',new.id,',name=',new.name,',money=',new.money,'}'));
END$

DELIMITER ;

-- 修改account表
UPDATE account SET money=3500 WHERE id=3;

-- 查询account表
SELECT * FROM account;

-- 查询日志表
SELECT * FROM account_log;

创建DELETE触发器

-- 创建DELETE触发器
DELIMITER $

CREATE TRIGGER account_delete
AFTER DELETE
ON account
FOR EACH ROW
BEGIN
	INSERT INTO account_log
	VALUES (NULL,'DELETE',NOW(),
	old.id,CONCAT('删除前{id=',old.id,',name=',old.name,',money=',old.money,'}'));
END$

DELIMITER ;

-- 删除account表数据
DELETE FROM account WHERE id=3;

-- 查询account表
SELECT * FROM account;

-- 查询日志表
SELECT * FROM account_log;
查看触发器:
-- 查看触发器
SHOW TRIGGERS;
删除触发器:
-- 标准语法
DROP TRIGGER 触发器名称;

-- 删除DELETE触发器
DROP TRIGGER account_delete;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL触发器 的相关文章

  • 唯一约束与唯一索引?

    之间有区别吗 CREATE TABLE p product no integer name text UNIQUE price numeric and CREATE TABLE p product no integer name text
  • 删除重复的行并需要在mysql中保留所有行中的一个[重复]

    这个问题在这里已经有答案了 我想删除基于两列的重复行 但需要保留所有行 1 行 重复行可以多于两行 例如 ID NAME PHONE 1 NIL 1234 2 NIL 1234 3 NIL 1234 4 MES 5989 我想从上面 3 行
  • 如何使用 SQL 通过表示多级订单的 varchar 字段正确排序?

    我不太喜欢数据库 我发现在查询上出现以下问题SQL服务器数据库旧的遗留应用程序的 我声明不幸的是我无法更改数据库结构 字段类型 这非常难看 我有以下情况 SELECT Sottocategoria IdSottocategoria IdCa
  • 如何在 Spring Data 中选择不同的结果

    我在使用简单的 Spring Data 查询或 Query 或 QueryDSL 在 Spring Data 中构建查询时遇到问题 如何选择三列 研究 国家 登录 不同的行 并且查询结果将是用户对象类型的列表 Table User Id S
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • ASP SQL Server 连接

  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • MySQL:如何获取每个分组的x个结果数[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 如何连续添加起始行和下一行的值

    我只想创建一个 sql 查询 结果就像图片上的那样 类似于 SQL 中的斐波那契数列 Ex Column 1 10 则 Result 列的值为 Result 10 因为这是第一行 然后假设column1第二行的值为50 那么Result第二
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 包含列和行总计的 SQL 数据透视表

    我正在尝试将行和列总计添加到该数据透视表中 create table test4 city nvarchar 10 race nvarchar 30 sex nvarchar 10 age int insert into test4 val
  • postgresql 登录到另一个表时发生冲突

    我正在使用 PostgreSQL 9 5 并尝试使用批量插入每天插入数百万行 INSERT INTO tours as cst adults country id price VALUES 3 129 80 2 119 120 on con
  • NVARCHAR 变量在Where 子句中不起作用

    在 SQL Server 我想是 2018 我不知道如何判断 中 我的变量不起作用WHERE的条款NVARCHAR 比较应该返回值 但它什么也没返回 如果我只是手动输入声明的文本 它会突然起作用并返回值 没有任何逻辑原因应该有任何不同 类型
  • Snowflake 中的动态 SQL

    当我在雪花中运行动态 SQL 时 遇到以下错误 未完成对 SQL MAIN 的分配 因为值超出了变量的大小限制 它的大小是263 限制为 256 内部存储大小以字节为单位 这是代码 SET v G 1 SET v G1 v G VARCHA
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • H2 SQL 日期比较

    在 H2 数据库中 如何在 TIMESTAMP 类型的列上运行查询 SELECT FROM RECORDS WHERE TRAN DATE lt 2012 07 24 Try 2012 07 24
  • SQL Server:为什么 ISO-8601 格式的日期依赖于语言?

    我需要一些帮助来理解 SQL Server 中的日期格式处理 如果您尝试以下操作 它将返回正确的结果 SET LANGUAGE English SELECT CAST 2013 08 15 AS DATETIME 2013 08 15 00
  • SQL 使用另一列的键和最大值设置列

    我需要根据同一 ID 的 duration 列的最大值更新 max register 列 将值设置为 1 其他值设置为 0 初始表 Id duration max register 1 0 0 1 7 0 1 3 0 2 10 0 2 5
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ

随机推荐

  • java实现5种不同的验证码图片,包括中文、算式等,并返回前端

    导入以下依赖
  • Windows修改右键新建菜单【Win10、Win11版】

    目录 一 引言 二 方法一 三 成果展示 四 方法二 删除Shell New 五 方法三 借助shellNewSettings小工具 一 引言 有些混乱的windows桌面新建菜单 是不是让人很不舒服 比如下图 图中的Access需要新建么
  • 浅谈VPS

    1 VPS的原理 VPS是采用VPS VirtualPrivateServer 技术 将一部物理服务器分割成多个虚拟专享服务器 分割后形成的VPS虚拟主机都可分配独立公网IP地址 独立操作系统Windows Linux 独立享用空间 独立内
  • 5.4.1 虚拟专用网VPN

    5 4 1 虚拟专用网VPN 我们已经学习了因特网的路由协议 5 3 1 因特网的路由协议 一 5 3 2 因特网的路由协议 二 基于距离向量算法的RIP协议 5 3 3 因特网的路由协议 三 OSPF协议 5 3 4 因特网的路由协议 四
  • TCP滑动窗口 和 拥塞窗口

    结论 滑动窗口 表征发送端和接收端的接收能力 拥塞窗口 表征中间设备的传输能力 TCP滑动窗口 需要说明一下 如果你不了解TCP的滑动窗口这个事 你等于不了解TCP协议 我们都知道 TCP必需要解决的可靠传输以及包乱序 reordering
  • 计算智能:不确定知识与推理

    不确定性 简单来说 不确定性指的是条件A不能100 推导出结论B 不确定性是现实问题中的常态 比如说医学中症状向疾病的推导等等 信度是智能体主动提供的对于相关命题的信心 它来自于已经接受到的感知信息 智能体获得新的感知信息后 其概率评估应得
  • 语雀导出知识库内所有文档为markdown格式备份

    语雀 写在前面 本复刻版本无法提交issue 有问题欢迎到语雀评论区和我交流 我一般不看csdn的评论 需要找我请到语雀文章评论区 欢迎给我的语雀文档点赞 或者给我复刻的仓库star 另外我想说明一下 复刻这个仓库的目的是为了防止重要的笔记
  • navigator对象

    navigator 对象是 JavaScript 中的一个内置对象 表示当前浏览器的信息和状态 它提供了访问浏览器相关信息的属性和方法 下面是一些 navigator 对象的常见属性和方法 navigator userAgent 返回包含浏
  • MySQL慢查询日志总结

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录 它用来记录在MySQL中响应时间超过阀值的语句 具体指运行时间超过longquerytime值的SQL 则会被记录到慢查询日志中 longquerytime的默认值为10
  • 在ubuntu18.04下安装 elsasticsearch-head 插件

    下载链接地址为 https github com mobz elasticsearch head archive master zip 下载命令如下 下载完成之后使用 unzip master zip 命令对下的压缩包进行解压 查看node
  • Qt连接远程SqlServer数据库,遍历结果集速度慢

    如题 我用qt连接远程的sqlserver数据库 一共110条数据 查询的时候遍历结果非常慢 达到十几秒左右 一开始我以为是结构体本身的问题 把结构体里面的赋值函数参数改成引用传递后 速度有所改善 缩短到9秒左右 但是并没有改变根本 最后我
  • AES-GCM加密算法的简单介绍

    一 什么是AES加密 常见的加密主要分为两类 对称加密和非对称加密 AES加密就是对称加密的一种 即加密和解密使用相同的一把密钥 它的全称是Advanced Encryption Standard 高级加密标准 主要是用来取代DES加密算法
  • mobx v6 + react hook 状态管理配置

    react hook 风格下不再使用class类的形式定义组件 也就不再适用mobx以前版本的装饰器语法 以下分享 reack hook 语法风格下使用 mobx v6 版本的状态管理配置使用方式 相关依赖版本 react 17 0 2 m
  • Spark基本概念

    Application 指的是用户编写的Spark应用程序 代码 包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码 Driver Spark中的Driver即运行行数Application的Main 函数并且创建
  • 为什么一个mac可以对应多个ip_路由器、交换机、IP、MAC原来可以这样理解

    先理解它们能够代表着什么 数据帧 快递 二层MAC地址 你的身份证号 全球唯一 三层IP地址 你的当前的住宅地址 你随时可能会搬去其他地址住额外的 规则 一个住宅地址只能住一个人 否则会导致收发快递不正常 交换机 给你派件的快递员 但是只认
  • CTFSHOW 萌新计划web9-15

    题目地址 http ctf show 0x01 web9 乍一看别被迷惑了 这个正则是字符串中包含 system exec highlight才能执行eval if preg match system exec highlight i c
  • 如何用logging记录python实验结果?

    做python实验有时候需要打印很多信息在控制台 console 但是控制台的信息不方便回顾和保存 故而可以采用logging将信息存储起来 先新建一个文件message log 代码如下 import logging logging ba
  • Android Studio 守护进程 错误 Error:Unable to start the daemon process....

    简介 有段时间没有使用Android Studio 最近使用AS打jar包的时候 不知道什么原因 突然出现了的问题 下面也没有详细的错误信息 网上很多解决类似问题的做法都是说AS在启动Jvm时候的空间问题 然而这个问题的下划线下面是有更详细
  • 航天生物计算机作文,科幻遨游太空作文(精选6篇)

    科幻遨游太空作文 精选6篇 导语 很多人语文成绩上不去 都是因为作文分数一直提不上去 为了让您在写作文时更加简单方便 下面是小编为大家收集的科幻遨游太空作文 精选6篇 欢迎大家借鉴与参考 希望对大家有所帮助 遨游太空作文1 太空 是一个充满
  • SQL触发器

    触发器 触发器是与表有关的数据库对象 可以在 insert update delete 之前或之后 触发并执行触发器中定义的SQL语句 触发器的这种特性可以协助应用在数据库端确保数据的完整性 日志记录 数据校验等操作 使用别名 NEW 和