diff --git "a/07 \345\210\230\346\226\207\351\224\213/20231012\350\247\246\345\217\221\345\231\250.md" "b/07 \345\210\230\346\226\207\351\224\213/20231012\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..a7315b07a1eaf79b2347b3fa5b81e8034382848a --- /dev/null +++ "b/07 \345\210\230\346\226\207\351\224\213/20231012\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,95 @@ +# 笔记 + +### 触发器 (trigger) + + 触发器是由事件来触发某个操作,这些事件包括insert,update,delete,事件。就是指用户的动作或触发了某项行为。 + + 如果定义了触发程序,当数据库执行这些语句的时候,就相当于事件发生了,就会自动激发触发器执行相应的操作。 + + 当对数据表中的数据执行插入,更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器实现。 + +语法: + +~~~ sql +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 触发器名; + +#### 主动报错 + +~~~ sql + signal sqlstate 'xxxx' set message_text= 'xxxxxx'; +~~~ + + + +## 作业 + +~~~ sql +-- ##### 食品库存表 (Food): + CREATE table food( + food_id int PRIMARY KEY auto_increment,-- 食品ID + food_name varchar(50), -- 食品名称 + quantity int -- 食品数量 + ); +-- food_id: 食品ID (主键) +-- food_name: 食品名称 +-- quantity: 食品数量 + + + + +-- ##### 食品采购记录表 (DeliveryLog): +CREATE TABLE DeliveryLog( +log_id int PRIMARY KEY auto_increment, -- 采购记录ID +food_id int,-- 食品ID +quantity int,-- 采购数量 +delivery_date VARCHAR(50),-- 采购日期 +FOREIGN KEY(food_id) REFERENCES `food`(food_id) +); +-- log_id: 采购记录ID (主键) +-- food_id: 食品ID (外键) +-- quantity: 采购数量 +-- delivery_date: 采购日期 +drop TRIGGER chufaqi +delimiter // +CREATE TRIGGER chufaqi +after insert on food +for each row +BEGIN +DECLARE num int; +DECLARE myid int; +SELECT food_id,quantity into myid,num from food where food_id=(SELECT count(*) from food); + +INSERT INTO DeliveryLog VALUES(null,myid,num,now()); +end // + +INSERT into food VALUES +(null,'锋少',100); + +SELECT * FROM DeliveryLog; + +~~~ \ No newline at end of file