From b84a0a989ca72276fbba55af7eec12babb704b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=BD=B3=E5=AE=87=2E?= <2541095587@qq.com> Date: Mon, 14 Oct 2024 16:28:06 +0800 Subject: [PATCH 1/3] =?UTF-8?q?20241014=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\344\270\216\344\275\234\344\270\232.md" | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 "\345\220\264\344\275\263\345\256\207/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" diff --git "a/\345\220\264\344\275\263\345\256\207/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\220\264\344\275\263\345\256\207/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 0000000..ce90b6a --- /dev/null +++ "b/\345\220\264\344\275\263\345\256\207/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,114 @@ +# 1.笔记 + +1. ### 创建 + + 1. ```sql + create trigger 触发器名 触发时机(before/after) 触发事件(delete/update/insert) on 被监控的表 for each row + begin + -- 需要被触发的语句,即sql语句 + end; + ``` + +2. ### 删除 + + 1. ```sql + drop trigger 触发器名 + ``` + +3. ### 查询 + + 1. ```sql + show triggers; -- 查询所有触发器 + show triggers from 数据名 like '表名'; -- 查询具体表的触发器 + show triggers where 'TRIGGER' like 触发器名称; -- 查询具体的触发器 + ``` + +4. ### 修改 + + 1. #### 触发器和存储过程和自定义函数一样只能删除再建,不能修改 + +5. ### 主动报错或抛出异常 + + 1. ```sql + SIGNAL SQLSTATE 'XXXXX' set MESSAGE_TEXT = '提示信息’; + ``` + +# 2.练习と作业 + +```sql +-- 课堂练习 +# 1.删除员工,扣除部门的总工资对应的金额 +create trigger delete_emp_to_dept after delete on emp for each ROW +update dept set total_salary = total_salary - ifnull(old.salary,0) where old.dept_id = dept_id; + +# 2.增加员工,增加部门的总工资对应的金额 +create trigger insert_dept_for_emp after insert on emp for each row +update dept set total_salary = total_salary + ifnull(new.salary,0) where new.dept_id = dept_id; + +# 3.修改员工,更新部门的总工资对应的金额 +drop trigger update_dept_for_emp; +create trigger update_dept_for_emp after update on emp for each row +update dept set total_salary = ifnull(total_salary,0) - ifnull(old.salary,0) + ifnull(new.salary,0) where new.dept_id = dept_id; + +# 4.只允许有10个员工,怎么通过触发器来限制# +drop trigger count; +create trigger count after insert on emp for each row +begin +declare emp_count int; +select count(*) into emp_count from emp; +if emp_count > 10 then signal sqlstate '77777' set message_text = '只允许有10个员工'; +end if; +end; + +-- 课后作业 +#1.要求部门表的中总工资一定是由员工表产生的,是否可以实现对部门总工资的保护,不让人随便改动部门表,让它的总工资只能由员工表的数据来影响。 +create trigger dept_emp before update on dept for each ROW +begin +declare emp_numsal decimal(10,2); +select sum(salary) into emp_numsal from emp where dept_id = new.dept_id; +if emp_numsal != new.total_salary then signal sqlstate '77777' set message_text = '部门总工资受保护不允许随便更改'; +end if; +end; +``` + + + +# 3.sql准备数据 + +```sql +-- 数据 结构 表 +create database trigger; +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for dept +-- ---------------------------- +DROP TABLE IF EXISTS `dept`; +CREATE TABLE `dept` ( + `dept_id` int NOT NULL AUTO_INCREMENT, + `dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `total_salary` decimal(10, 2) NULL DEFAULT NULL, + PRIMARY KEY (`dept_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of dept +-- ---------------------------- +INSERT INTO `dept` VALUES (10, '开发部', 0.00); +INSERT INTO `dept` VALUES (20, '后勤部', 0.00); +INSERT INTO `dept` VALUES (30, '财务部', 0.00); + +-- ---------------------------- +-- Table structure for emp +-- ---------------------------- +DROP TABLE IF EXISTS `emp`; +CREATE TABLE `emp` ( + `emp_id` int NOT NULL AUTO_INCREMENT, + `emp_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `dept_id` int NULL DEFAULT NULL, + `salary` decimal(10, 2) NULL DEFAULT NULL, + PRIMARY KEY (`emp_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; +SET FOREIGN_KEY_CHECKS = 1; +``` \ No newline at end of file -- Gitee From d1fb46a322dc51bfcb9ab0470c03a9aa4ad111d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=BD=B3=E5=AE=87=2E?= <2541095587@qq.com> Date: Mon, 14 Oct 2024 16:35:43 +0800 Subject: [PATCH 2/3] update --- ...40\344\270\216\344\275\234\344\270\232.md" | 72 +++---------------- 1 file changed, 8 insertions(+), 64 deletions(-) diff --git "a/\345\220\264\344\275\263\345\256\207/20241011 \346\270\270\346\240\207\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" "b/\345\220\264\344\275\263\345\256\207/20241011 \346\270\270\346\240\207\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" index ae9934e..57a1532 100644 --- "a/\345\220\264\344\275\263\345\256\207/20241011 \346\270\270\346\240\207\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" +++ "b/\345\220\264\344\275\263\345\256\207/20241011 \346\270\270\346\240\207\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232.md" @@ -105,10 +105,10 @@ begin declare emp_sal decimal(8,2); -- 存放工资的变量 declare emp_id int; -- 存放员工编号的变量 declare count int; -- 存放员工编号的变量 - declare done int default 0; -- 退出循环的变量 - declare emp_count int default 0; -- 计数器,统计多少个人增加了奖金 + declare done int default 0; -- 进行循环的变量 + declare emp_count int default -1; -- 计数器,统计多少个人增加了奖金 declare demo02 cursor for select ifnull(comm,0),sal,empno from emp; -declare exit handler for not found set done = 1; -- 当游标查询不到数据时修改done变量为1退出循环 +declare continue handler for not found set done = 1; -- 当游标查询不到数据时修改done变量为1退出循环 open demo02; -- 打开游标 while done = 0 do -- while用来遍历所有员工 fetch demo02 into emp_comm,emp_sal,emp_id; @@ -146,6 +146,7 @@ end; call demo3(); -- 利用游标,查询并计算出emp表中全公司的总支出(sal+comm) +-- 这题还是有问题 create procedure demo4() begin declare esal decimal(8,2); -- 存放员工工资 @@ -155,74 +156,17 @@ begin declare eid int; -- 存放员工编号 declare done int default 0; -- 进行循环的条件 declare demo04 cursor for select empno,sal,ifnull(comm,0) from emp; -- 声明游标 - declare exit handler for not found set done = 1; -- 退出循环的条件 + declare continue handler for not found set done = 1; -- 退出循环的条件 open demo04; -- 打开游标 while done = 0 do fetch demo04 into eid,esal,ecomm; -- 获取游标数据 - select sal,ifnull(comm,0) into esal,ecomm from emp where empno = eid; + select ifnull(sal,0),ifnull(comm,0) into esal,ecomm from emp where empno = eid; set sum = esal + ecomm; - set @esum = @esum + sum; + set esum = esum + sum; end while; close demo04; - select @esum 公司总支出; + select esum 公司总支出; end; call demo4(); - --- 准备数据 -create database if not exists db_view; -use db_view; - -# 部门表 -create table dept( - deptno int primary key, - dname varchar(20), - loc varchar(20) -); -insert into dept values(10, '教研部','北京'), -(20, '学工部','上海'), -(30, '销售部','广州'), -(40, '财务部','武汉'); - -# 员工表 -create table emp( - empno int primary key, - ename varchar(20), - job varchar(20), - mgr int, - hiredate date, - sal numeric(8,2), - comm numeric(8, 2), - deptno int, --- FOREIGN KEY (mgr) REFERENCES emp(empno), - FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL ON UPDATE CASCADE -); -insert into emp values -(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), -(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), -(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), -(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), -(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), -(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), -(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), -(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), -(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), -(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), -(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), -(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), -(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), -(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); - -# 工资等级表 -create table salgrade( - grade int primary key, - losal int, - hisal int -); -insert into salgrade values -(1, 7000, 12000), -(2, 12010, 14000), -(3, 14010, 20000), -(4, 20010, 30000), -(5, 30010, 99990); ``` -- Gitee From c2d94ef5ca4cf05d5a9c699b7a757b90fe5d3a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=BD=B3=E5=AE=87=2E?= <2541095587@qq.com> Date: Mon, 14 Oct 2024 16:59:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?20241014=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\203\344\271\240\344\270\216\344\275\234\344\270\232.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/\345\220\264\344\275\263\345\256\207/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\220\264\344\275\263\345\256\207/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" index ce90b6a..e9fafb1 100644 --- "a/\345\220\264\344\275\263\345\256\207/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\220\264\344\275\263\345\256\207/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" @@ -68,7 +68,7 @@ declare emp_numsal decimal(10,2); select sum(salary) into emp_numsal from emp where dept_id = new.dept_id; if emp_numsal != new.total_salary then signal sqlstate '77777' set message_text = '部门总工资受保护不允许随便更改'; end if; -end; +end; -- 删除数据时也会抛出异常 ``` @@ -77,7 +77,7 @@ end; ```sql -- 数据 结构 表 -create database trigger; +create database trigger_info; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- Gitee