diff --git "a/29 \350\267\257\347\216\262/20231012 \350\247\246\345\217\221\345\231\250\344\275\234\344\270\232.md" "b/29 \350\267\257\347\216\262/20231012 \350\247\246\345\217\221\345\231\250\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..0c327ff063455535205d0aa0ef5f7a5a406bc791 --- /dev/null +++ "b/29 \350\267\257\347\216\262/20231012 \350\247\246\345\217\221\345\231\250\344\275\234\344\270\232.md" @@ -0,0 +1,136 @@ +## 笔记 + +### 触发器 + +注意:1. 帮助我们记录操作日志。 + +​ 2.在操作数据前,对数据进行合法性检查 + +​ 3.确保数据的完整性 + +语法: + +```mysql +create trigger 触发器名称 +{before/after}{update/delete/insert} on 表名 +for each row (监控每一行) +触发器执行语句 +``` + +缺点:不好维护 + +## 作业 + +```mysql +create database ec20 charset utf8; +use ec20; + +-- 题目:创建两个表,其中,只要a表,增加、删除、修改,b表就会记录。 + +create table a( +id int primary key auto_increment, +name varchar(20) +); +create table b( +id int primary key auto_increment, +teet varchar(50) +); + +-- 添加 +drop trigger t1; +delimiter // +create trigger t1 +after insert on a +for each row +BEGIN +insert into b values(null,concat_ws(' ','a表在',now(),'创建了一个数据')); +end // +delimiter ; + +-- 修改 +drop trigger t2; +delimiter // +create trigger t2 +after update on a +for each row +begin +insert into b values(null,concat_ws(' ','a表在',now(),'修改了一条数据')); +end // +delimiter ; + +-- 删除 +drop trigger t3; +delimiter // +create trigger t3 +after delete on a +for each row +begin +insert into b values(null,concat_ws(' ','a表在',now(),'删除了一条数据')); +end // +delimiter ; + + +-- 利用触发器,限制a表插入数据的总行数为10. +drop trigger t4; +delimiter // +create trigger t4 +before insert on a +for each row +begin +declare cou int ; +select count(*) into cou from a; +if cou >= 10 then +signal sqlstate 'MD001' set message_text='行数已经超过10行了,不能再进行添加'; +end if; +end // +delimiter ; +-- +-- ### 练习 +-- +-- 模拟一个食品库存表,当食品采购时,记录采购信息并更改库存。 +-- ##### 食品库存表 (Food): +-- +-- food_id: 食品ID (主键) +-- food_name: 食品名称 +-- quantity: 食品数量 +-- +-- ##### 食品采购记录表 (DeliveryLog): +-- +-- log_id: 采购记录ID (主键) +-- food_id: 食品ID (外键) +-- delivery_date: 采购日期 +create table food( +fid int primary key auto_increment, +fname varchar(50), +quantity int +); + +create table log( +lid int primary key auto_increment, +quantity int, +de_date datetime, +f_id int, +foreign key(f_id) references food(fid) +); + +drop trigger t5; +delimiter // +create trigger t5 +after insert on food +for each row +begin +declare quan int; +declare cou int; +select count(*) into cou from food; +select quantity into quan from food where fid=cou; + insert into log values(null,quan,now(),cou); +end // +delimiter ; + +insert into food values(null,'白菜',100); +insert into food values(null,'番茄',200); +insert into food values(null,'西红柿',120); +insert into food values(null,'土豆',10); + +``` +