MySQL——触发器(trigger)基本结构

news2024/12/25 12:54:00


1、修改分隔符符号

delimiter $$

$$可以修改

2、创建触发器函数名称

create trigger 函数名 

3、什么样在操作触发,操作哪个表

after :……之后触发 

before :……之后触发 

insert :……之后触发 

update :……之后触发 

delete :……之后触发 


on 表名

实例

after insert on user

4、for each row 声明每次触发都被执行

5、 开始触发器代码

begin

6、 触发器触发后执行代码块

7、 结束触发器

end ;

8、 修改分隔符

$$

delimiter ; 

DDL

CREATE TABLE user (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE user_wallet (
    wallet_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);
CREATE TABLE user_wallet_log (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    transaction_type VARCHAR(50) NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    transaction_time TIMESTAMP NOT NULL,
    FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
);
 
CREATE TABLE product_type (
    type_id INT AUTO_INCREMENT PRIMARY KEY,
    type_name VARCHAR(100) NOT NULL,
    parent_id INT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE product (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    stock INT NOT NULL DEFAULT 0,
    type_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (type_id) REFERENCES product_type(type_id) ON DELETE RESTRICT
);
 
CREATE TABLE `order` (
    `order_id` INT AUTO_INCREMENT PRIMARY KEY,
    `user_id` INT NOT NULL,
    `order_status` VARCHAR(50) NOT NULL DEFAULT '待支付',
    `order_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `payment_status` VARCHAR(50) NOT NULL DEFAULT '未支付',
    `payment_time` TIMESTAMP NULL,
    `total_price` DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    FOREIGN KEY (`user_id`) REFERENCES `user`(`user_id`) ON DELETE RESTRICT
);
 
CREATE TABLE order_info (
    order_info_id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    unit_price DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES `order`(order_id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES product(product_id) ON DELETE RESTRICT
);

DML

user相关

 
-- 插入10条用户数据
INSERT INTO `user` VALUES ('1', '王语嫣', 'password1', 'user1@example.com', '13800000001', '2024-06-06 22:07:39');
INSERT INTO `user` VALUES ('2', '小龙女', 'password2', 'user2@example.com', '13800000002', '2024-06-09 22:07:39');
INSERT INTO `user` VALUES ('3', '赵灵儿', 'password3', 'user3@example.com', '13800000003', '2024-06-09 22:07:39');
INSERT INTO `user` VALUES ('4', '杨过', 'password4', 'user4@example.com', '13800000004', '2024-05-31 22:07:39');
INSERT INTO `user` VALUES ('5', '向问天', 'password5', 'user5@example.com', '13800000005', '2024-06-04 22:07:39');
INSERT INTO `user` VALUES ('6', '杨潇', 'password6', 'user6@example.com', '13800000006', '2024-06-01 22:07:39');
INSERT INTO `user` VALUES ('7', '郭靖', 'password7', 'user7@example.com', '13800000007', '2024-06-01 22:07:39');
INSERT INTO `user` VALUES ('8', '黄蓉', 'password8', 'user8@example.com', '13800000008', '2024-06-04 22:07:39');
INSERT INTO `user` VALUES ('9', '程英', 'password9', 'user9@example.com', '13800000009', '2024-06-08 22:07:39');
INSERT INTO `user` VALUES ('10', '郭襄', 'password10', 'user10@example.com', '13800000010', '2024-06-08 22:07:39');
 
 
-- 插入10条用户钱包数据,与user表对应
INSERT INTO `user_wallet` VALUES ('1', '1', '422.00', '2024-06-08 22:07:42');
INSERT INTO `user_wallet` VALUES ('2', '2', '897.00', '2024-06-04 22:07:42');
INSERT INTO `user_wallet` VALUES ('3', '3', '354.00', '2024-06-03 22:07:42');
INSERT INTO `user_wallet` VALUES ('4', '4', '758.00', '2024-06-07 22:07:42');
INSERT INTO `user_wallet` VALUES ('5', '5', '319.00', '2024-06-06 22:07:42');
INSERT INTO `user_wallet` VALUES ('6', '6', '350.00', '2024-06-08 22:07:42');
INSERT INTO `user_wallet` VALUES ('7', '7', '871.00', '2024-06-04 22:07:42');
INSERT INTO `user_wallet` VALUES ('8', '8', '515.00', '2024-06-05 22:07:42');
INSERT INTO `user_wallet` VALUES ('9', '9', '1042.00', '2024-06-05 22:07:42');
INSERT INTO `user_wallet` VALUES ('10', '10', '273.00', '2024-06-03 22:07:42');
 
 
 
-- 插入10条用户钱包交易日志数据
INSERT INTO `user_wallet_log` VALUES ('1', '1', '充值', '100.00', '2024-06-01 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('2', '2', '消费', '50.00', '2024-06-08 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('3', '3', '提现', '200.00', '2024-06-09 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('4', '4', '充值', '150.00', '2024-05-31 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('5', '5', '消费', '75.00', '2024-06-04 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('6', '6', '提现', '300.00', '2024-06-02 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('7', '7', '充值', '250.00', '2024-06-09 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('8', '8', '消费', '120.00', '2024-06-07 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('9', '9', '提现', '400.00', '2024-06-08 22:07:48');
INSERT INTO `user_wallet_log` VALUES ('10', '10', '充值', '300.00', '2024-05-31 22:07:48');

product相关

INSERT INTO `product_type` VALUES ('1', '智能手机', null, '包含各种品牌和型号的智能手机,涵盖不同价格区间和功能特点。', '2024-05-31 22:13:55');
INSERT INTO `product_type` VALUES ('2', '笔记本电脑', null, '提供多种类型和配置的笔记本电脑,适用于不同工作和学习需求。', '2024-06-01 22:13:55');
INSERT INTO `product_type` VALUES ('3', '智能家居', null, '包含智能家居设备,如智能音箱、智能照明、智能门锁等。', '2024-06-02 22:13:55');
INSERT INTO `product_type` VALUES ('4', '电视与显示器', null, '涵盖各种尺寸和分辨率的电视与显示器,适用于家庭和企业使用。', '2024-06-03 22:13:55');
INSERT INTO `product_type` VALUES ('5', '耳机与音响', null, '提供高品质耳机和音响设备,满足用户的音频体验需求。', '2024-06-04 22:13:55');
INSERT INTO `product` VALUES ('1', 'iPhone 13', '6999.00', '100', '1', '2024-06-05 22:13:55');
INSERT INTO `product` VALUES ('2', 'MacBook Pro', '14999.00', '50', '2', '2024-06-06 22:13:55');
INSERT INTO `product` VALUES ('3', '小米智能音箱', '199.00', '200', '3', '2024-06-07 22:13:55');
INSERT INTO `product` VALUES ('4', '三星65寸4K电视', '7999.00', '80', '4', '2024-06-08 22:13:55');
INSERT INTO `product` VALUES ('5', '索尼降噪耳机', '1299.00', '150', '5', '2024-06-09 22:13:55');
INSERT INTO `product` VALUES ('6', '华为MatePad Pro', '3999.00', '70', '2', '2024-05-31 22:13:55');
INSERT INTO `product` VALUES ('7', '小米米家智能灯泡', '79.00', '300', '3', '2024-06-01 22:13:55');
INSERT INTO `product` VALUES ('8', 'LG 27寸显示器', '1499.00', '120', '4', '2024-06-02 22:13:55');
INSERT INTO `product` VALUES ('9', '苹果AirPods Pro', '1599.00', '90', '5', '2024-06-03 22:13:55');
INSERT INTO `product` VALUES ('10', '一加9 Pro', '4999.00', '60', '1', '2024-05-30 22:13:55');

DQL 

delimiter $$  -- 分隔符
create trigger after_inster_user -- 创建触发器的名称
after insert on `user` -- 用户表执行插入操作之后被出发的触发器
for each row -- 每行数据都要进行触发
begin

	 #insert into `user` values(0,'散兵','password88','sanbing@qq.com','1234567890','2024-06-17 22:07:39');  
	 #能添加但执行插入语句时报错1442 - Can't update table 'user' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
	 #1. MYSQL中触发器中不能对本表进行 insert ,update ,delete操作,以免递归循环触发
     #2. 对于update 只能用set进行操作,insert与delete只能借助第二张表才能实现需求,如果可以最好用存储过程代替触发器 
     #3. 注意唯一索引不能有重复值
     
    INSERT INTO user_wallet (user_id, balance)  -- 在user_wallet表中插入一行数据
     VALUES (NEW.user_id, 0.00);  -- 使用NEW.user_id作为新插入行的user_id,balance为0.00
end ;
$$
delimiter ; -- 结束$$的有效性更换成;

输出 

delimiter $$ 
create trigger after_insert_user
before insert on `user`
for each row
begin
   signal sqlstate '45000' set message_text = '我们人为的停止了数据commit'; 
	 # signal sqlstate '45000' 代表错误,会停止操作,包含插入语句也会取消commit操作
end;
$$
delimiter $$

删 


delete from `user` where user_id=5;
# 报错,删除用户前需要删除从表的数据。
delimiter $$ 
create trigger delete_info_user
before delete on `user`
for each row
begin
	delete from user_wallet where user_id=old.user_id;
	delete from user_wallet_log where user_id=old.user_id;
end;
$$
delimiter ;

delete from `user` where user_id=5;
#成功

delimiter $$ 
create trigger product_update_price
before update on product 
for each row
begin
   -- 编写代码的区域
	 declare result decimal(10,4); -- 声明变量,必须在头部。
	 if new.price=0 then 
		signal sqlstate '45000' set message_text='新价格不能为0。';
	 end if;
	 set result =(new.price-old.price)/old.price*100;
	 if abs(result)>10 then  -- abs():返回绝对值
	  signal sqlstate '45000' set message_text = '价格上下浮动不能超过10%。';
	 end if;
end;
$$
delimiter ;

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

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

相关文章

Flutter【组件】点击类型表单项

简介 flutter 点击表单项组件,适合用户输入表单的场景。 点击表单项组件是一个用户界面元素,通常用于表单或设置界面中,以便用户可以点击它们来选择或更改某些设置或输入内容。这类组件通常由一个标签和一个可点击区域组成,并且…

轻松ChatGPT的使用技巧,让你的生活更智能

ChatGPT,由OpenAI的GPT-3.5架构支持,已经彻底改变了我们与人工智能互动的方式。这个先进的语言模型被证明是一种多功能的工具,能够处理各种对话任务。不过,用户可以通过一些技巧和窍门,进一步提升使用ChatGPT的体验&am…

世界是软件定义的 - 正如硬件公司所证明的那样

很难相信,马克安德森(Marc Andressen)在13年前写下了他著名的博客,题为“软件正在吞噬世界”。在这篇文章中,他谈到了现代软件组织对传统企业造成的破坏。 十三年后,即使面对英伟达的平流层估值&#xff0…

echarts隔行背景色

看了下使用说明,试了半天终于搞对了 参考文档:Documentation - Apache ECharts option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [120, 200, 150, 80, 70, 110, 130],type: bar,mar…

代码随想录第30天|贪心算法

122.买卖股票的最佳时机II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得…

装备制造业CRM解决方案

01、数字化转型驱动企业,向“以客户需求驱动创新生产”的智能制造业转变 我国装备制造业经过多年的发展,取得了令人瞩目的成就,形成了门类齐全、具有相当规模和一定水平的产业体系;主要包含通用设备、专用设备、电气机械、交通运…

Adobe Illustrator 矢量绘图软件下载,Ai 2024最新版获取!

Adobe Illustrator,无论是艺术品、图标还是海报等设计作品,Adobe Illustrator都能以超凡的表现力展现出设计师们的创意与才华。 近年来,随着人工智能技术的迅猛发展,各行各业都纷纷将这一技术引入自身领域,以提升工作效…

白驹过隙,沧海桑田

01. 机缘 今天是我加入CSDN的第2620天,是我成为创作者的第1024天。2021 年 08 月 25 日我在这里分享了人生中第一篇技术文章 springboot 签名验证。 现在在回看这篇文章还能感觉到当时的青涩和技术的薄弱,后面每一篇文章的输出可能都是在不断的学习和进…

PgSQL-添加列、字段的注释

mysql是: 添加列:--alter table 表名 add column 列名 varchar(30);ALTER TABLE p_show ADD COLUMN points VARCHAR(100) COMMENT 所需积分;---------------------------------------------------------------------------------------------添加、修改…

记某大学的一次EduSRC的挖掘

0x1 前言 漏洞由来简述 首先讲下这个漏洞的由来吧,这类漏洞叫做OSS储存桶漏洞,是阿里云OSS存储云安全的漏洞,也是一个相对来讲比较新鲜的安全漏洞。我是在进行对某大学的小程序进行文件上传测试的时候发现返回包的URL里面有“OSS”字段&…

CID引流电商助力3C产品销售腾飞的实践与思考

摘要:随着互联网技术的不断发展和普及,电商行业迎来了前所未有的发展机遇。其中,CID引流电商作为一种新兴的电商模式,为商家们提供了更加精准、高效的拓客之路。尤其在3C产品领域,CID引流电商更是助力其销售腾飞的重要…

描述React Hooks中的useMemo和useCallback的区别和用途。

React Hooks API中的useMemo和useCallback都是用于优化性能的钩子,但它们的用途和工作方式略有不同: 推荐大家看看我过往的文章 useMemo useMemo是一个性能优化钩子,它返回一个记忆化的值。useMemo可以避免在组件渲染时进行昂贵的计算或操作…

Mac电脑FTP客户端推荐:Transmit 5 for Mac 中文版

Transmit 5是一款专为macOS平台设计的功能强大的FTP(文件传输协议)客户端软件。Transmit 5凭借其强大的功能、直观易用的界面和高效的性能,成为需要频繁进行文件传输和管理的个人用户和专业用户的理想选择。无论是对于新手还是经验丰富的用户…

矿产资源和技术采矿服务的电子课程

我们为Nordgold的矿产资源和技术采矿服务开发了电子课程。基于客户的内部文件,我们创建了课程场景并将其组织成一个学习地图。我们的设计师准备了企业风格的设计布局和视觉效果,使枯燥的数据、表格和图表生动起来。使用Articulate Storyline,…

Java 从 6 到 21 的重要变动回顾

Java 从 6 到 21 的重要变动回顾 Java 自从发布以来,一直是全球最受欢迎的编程语言之一。其不断发展的特性和功能,使得它在各种应用程序中得以广泛应用。从 Java 6 到 Java 21,Java 语言和平台经历了许多重要的变动。本文将深入探讨这些变动…

不出网上线CS的各种姿势(内网横向)

情况一:存在一台中转机器 存在一台中转机器,这台机器出网,这种是最常见的情况。 经常是拿下一台边缘机器,其有多块网卡,用于连接内外网,内网机器都不出网。这种情况下拿这个边缘机器做中转,就…

SpringBoot+Vue物流快递仓库管理系统

物流快递仓库管理是一项非常繁琐复杂的工作,每天要处理大量的单据数据,包括入库、出库、退库、调库等多项货物操作流程。因此,为提高库管工作的质量和效率,就必须根据仓库管理的特点开发库存物流信息系统。 本文立足于物流信息系…

【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案 【格式】PDF版本 【关键词】麦肯锡、物流、价格战略、定价体系 【核心观点】 - 与竞争对…

websocket服务执行playwright测试

上一篇博客从源码层面分析了playwright vscode插件实现原理,在上一篇博客中提到,backend服务是一个websocket服务。这遍博客将介绍如何封装一个websocket服务,通过发送消息来执行playwright测试。 初始化项目 第一步是初始化项目和安装必要的…

深入研究websocket直播中signature这个参数怎么来的,模拟自己生成一个

上一节课我们已经找到了生成signature这个字段的代码位置,就是这个B函数,嗯......听起来好像有点奇怪,但是它确实叫B啊,笑死。不管了,看一下里面的逻辑是啥。 注意e参数的内容是: {"app_name":…