diff --git "a/44\344\273\243\347\221\236/20231012\350\247\246\345\217\221\345\231\250.md" "b/44\344\273\243\347\221\236/20231012\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..14aab412cd2620109a27f416dbcb6ee9d338b034 --- /dev/null +++ "b/44\344\273\243\347\221\236/20231012\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,119 @@ +# 笔记 + +触发器(trigger)是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。 + +事件A 对user表新增一条数据 姓名name 年龄age 性别sex + +事件B 对userlogs记录一条user表的操作 new.name,new.age + +触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操作。 + +使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。**触发器只支持行级触发** + +### 触发器的类型 + +| 类型 | NEW和OLD | +| ------ | ---------------------------------------- | +| insert | new代表将要新增或已新增的数据 | +| update | old代表更新前的数据、new代表更新后的数据 | +| delete | old代表将要删除或已删除的数据 | + +### 语法 + +创建触发器 + +``` +create trigger 触发器名称 +before/after(触发时机) insert/update/delete(触发类型) +on 表名 for each row -- 行级触发器 +begin + 触发的语句... +end; +``` + +查看 + +``` +show triggers; +``` + +删除 + +``` +drop trigger 触发器名称; +``` + +### 案例 + +通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中, 包含增、删、改 ; + +user_logs表结构 + +``` +create table user_logs( + id int(11) primary key auto_increment, + operation varchar(20) not null comment '操作类型, insert/update/delete', + operate_time datetime not null comment '操作时间', + operate_id int(11) not null comment '操作的ID', + operate_params varchar(500) comment '操作参数' +) +``` + +A.插入数据触发器 + +B.更新数据触发器 + +C.删除数据触发器 + +# 作业 + +``` +use carinfo; + + +##### 食品库存表 (Food): + +#food_id: 食品ID (主键) +#food_name: 食品名称 +#quantity: 食品数量 +create table food( + food_id int primary key auto_increment, # 食品ID (主键) + food_name varchar(50), # 食品名称 + quantity int # 食品数量 +); + +##### 食品采购记录表 (DeliveryLog): + +#log_id: 采购记录ID (主键) +#food_id: 食品ID (外键) +#quantity: 采购数量 +#delivery_date: 采购日期 +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) +); +#模拟一个食品库存表,当食品采购时,记录采购信息并更改库存。 + + +drop trigger dchu; + +delimiter // +create trigger dchu +after insert on food +for each row +begin +declare quan int; +declare id int; + select food_id,quantity into id,quan from food where food_id=(select count(*) from food); + insert into DeliveryLog values(null,id,quan,now()); +end // +delimiter ; + +insert into food VALUES +(null,'瑞',57); + +select * from DeliveryLog; +``` \ No newline at end of file