diff --git "a/\345\255\231\345\205\210\344\274\230/20241014 \350\247\246\345\217\221\345\231\250\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" "b/\345\255\231\345\205\210\344\274\230/20241014 \350\247\246\345\217\221\345\231\250\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..b9f7bcd1c6fa26a6afa56c036c2f7b4200d218c5 --- /dev/null +++ "b/\345\255\231\345\205\210\344\274\230/20241014 \350\247\246\345\217\221\345\231\250\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" @@ -0,0 +1,101 @@ +# 笔记 + +```sql +# 创建 +create trigger 触发器名称 触发时机(before / after)监控事件(insert / update / delete) on 表名 for each row +begin + -- 具体要被触发的操作,即一些语句 +end; + +# 修改,先删除再创建 + +# 查询 +show triggers;-- 查询所有触发器 +show triggers from db23 like 'order%';-- 通过表名名称查触发器 +show triggers where 'TRIGGER' like 'order%';-- 通过触发器名称查触发器 +show create trigger orders_be; + + +# 删除 +drop trigger 触发器名称; + +-- 触发的时机(before/after) 事件之前,还是事件之后触发 +-- insert事件,会产生新的一行,用new来表示,这一行中的各个字段,用new字段名来调用 +-- update事件,对旧数据的一行进行更新,产生新一行,用old表示旧一行,new表示新一行 +-- delete事件,只对旧数据进行删除,所以只有old来表示,要被删除的那行旧数据 + +# 什么要用begin、end +-- 当语句只有一行的时候,begin、end可以省略,同样适用于存储过程,函数,这些地方 +-- 多行语句,必须用begin end 包裹起来 +# 同一个表,同一个事,同一个时机,对同一个数据进行操作,不要重复建触发器 + +# 如何主动抛出异常 +SIGNAL SQLSTATE '45000' -- 5位数的错误信息,可以是5个纯数字或者大写字母 +SET MESSAGE_TEXT = '提示信息'; + + +# 例子: +create trigger 触发器名称 触发时机(before / after)监控事件(insert / update / delete) on 表名 for each row +begin + if 条件 then + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提示信息'; + end if; +end; +``` + + + +# 作业 + +```sql +# 1.删除员工,扣除部门的总工资对应的金额 +drop trigger if exists drop_test; +create trigger drop_test after delete on emp for each row +begin + UPDATE dept set total_salary=total_salary-old.salary where dept_id=old.dept_id; +end; + +# 2.增加员工,增加部门的总工资对应的金额 +drop trigger if exists insert_test; +create trigger insert_test after insert on emp for each row +begin + update dept set total_salary=total_salary+new.salary where dept_id=new.dept_id; +end; + +# 3.修改员工,更新部门的总工资对应的金额 +drop trigger if exists update_test; +create trigger update_test after update on emp for each row +begin + update dept set total_salary=total_salary+new.salary-old.salary where dept_id=new.dept_id; +end; + + +# 4.只允许有10个员工,怎么通过触发器来限制# +drop trigger if exists update_test1; +create trigger update_test1 after insert on emp for each row +begin + if new.emp_id>10 then + SIGNAL SQLSTATE '35000' SET MESSAGE_TEXT = '超过10了'; + end if; + + update dept set total_salary=total_salary+new.salary where dept_id=new.dept_id; +end; + + +-- 课后作业 +# 1.要求部门表的中总工资一定是由员工表产生的,是否可以实现对部门总工资的保护,不让人随便改动部门表,让它的总工资只能由员工表的数据来影响。 +drop trigger if exists update_test2; +create trigger update_test2 before update on dept for each row +begin + if old.total_salary != new.total_salary then + SIGNAL SQLSTATE '35000' SET MESSAGE_TEXT = '禁止修改'; + end if; + +end; + + + + + +``` +