From 3e077dda1bc4ad861ce86d4d55b817bc18154f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=99=BA=E7=BF=94?= <2045602860@qq.com> Date: Thu, 12 Oct 2023 15:39:38 +0000 Subject: [PATCH] =?UTF-8?q?34=20=E5=88=98=E6=99=BA=E7=BF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘智翔 <2045602860@qq.com> --- .../\350\247\246\345\217\221\345\231\250.md" | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "34 \345\210\230\346\231\272\347\277\224/\350\247\246\345\217\221\345\231\250.md" diff --git "a/34 \345\210\230\346\231\272\347\277\224/\350\247\246\345\217\221\345\231\250.md" "b/34 \345\210\230\346\231\272\347\277\224/\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..32504d0 --- /dev/null +++ "b/34 \345\210\230\346\231\272\347\277\224/\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,85 @@ +# 笔记 + +### 触发器 (trigger) + + 触发器是由事件来触发某个操作,这些事件包括insert,update,delete,事件。就是指用户的动作或触发了某项行为。 + + 如果定义了触发程序,当数据库执行这些语句的时候,就相当于事件发生了,就会自动激发触发器执行相应的操作。 + + 当对数据表中的数据执行插入,更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器实现。 + +语法: + +``` mysql + delimiter // + create trigger 触发器名称 + (before / after) (insert / update / delete) on 表名 + for each row + begin + 触发器执行的语句块 + end // + delimiter ; + + -- before:表示在事件之前触发。 + -- after:表示在事件之后触发。 + + -- 触发器执行的语句块:可以是单条sql,也可以是begin...end结构组成的复合语句块 +``` + +查看触发器: + + show triggers; + +查看某个触发器的定义 + + show create trigger 触发器名; + +删除触发器: + + drop trigger if exists 触发器名; + +#### 主动报错 + +``` mysql + signal sqlstate '...' set message_text= '....'; +``` + +### 作业 + +``` mysql +create database tt charset utf8; +use tt; +练习 +-- 模拟一个食品库存表,当食品采购时,记录采购信息并更改库存 + +食品库存表 (Food): +create table food( +food_id int primary key auto_increment, -- 食品ID (主键) +food_name varchar(20), -- 食品名称 +quantity int -- 食品数量 +); +食品采购记录表 (DeliveryLog): +create table deliverylog( +log_id int primary key auto_increment, -- 采购记录ID (主键) +food_id int, -- 食品ID (外键) +quantity int, -- 采购数量 +delivery_date date, -- 采购日期 +foreign key (food_id) references food(food_id) +); + + +delimiter // +create trigger tt +after insert on food +for each row +begin + declare myfood_id int; + declare myquantity int; + + select food_id into myfood_id from food where food_id = (select count(*) from food); + select quantity into myquantity from food where food_id = (select count(*) from food); + +insert into deliverylog values (null,myfood_id,myquantity,now()); +end // +delimiter ; +``` \ No newline at end of file -- Gitee