From 66253cb4016a9c074845b8f8410e69e18d38156c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B9=B2=E7=BA=AF=E6=AC=A3?= <1759931586@qq.com> Date: Mon, 21 Oct 2024 22:54:55 +0800 Subject: [PATCH] =?UTF-8?q?1021=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...74\345\220\210\347\273\203\344\271\240.md" | 549 ++++++++++++++++++ 1 file changed, 549 insertions(+) create mode 100644 "\345\271\262\347\272\257\346\254\243/2024.1021 \346\225\260\346\215\256\345\272\223\351\253\230\347\272\247\345\272\224\347\224\250\347\237\245\350\257\206\346\200\273\347\273\223\345\222\214\347\273\274\345\220\210\347\273\203\344\271\240.md" diff --git "a/\345\271\262\347\272\257\346\254\243/2024.1021 \346\225\260\346\215\256\345\272\223\351\253\230\347\272\247\345\272\224\347\224\250\347\237\245\350\257\206\346\200\273\347\273\223\345\222\214\347\273\274\345\220\210\347\273\203\344\271\240.md" "b/\345\271\262\347\272\257\346\254\243/2024.1021 \346\225\260\346\215\256\345\272\223\351\253\230\347\272\247\345\272\224\347\224\250\347\237\245\350\257\206\346\200\273\347\273\223\345\222\214\347\273\274\345\220\210\347\273\203\344\271\240.md" new file mode 100644 index 0000000..80f91b7 --- /dev/null +++ "b/\345\271\262\347\272\257\346\254\243/2024.1021 \346\225\260\346\215\256\345\272\223\351\253\230\347\272\247\345\272\224\347\224\250\347\237\245\350\257\206\346\200\273\347\273\223\345\222\214\347\273\274\345\220\210\347\273\203\344\271\240.md" @@ -0,0 +1,549 @@ +# #1021数据库高级应用知识总结 + +### 一、数据库设计 + +``` +如何让两个表之间产生联系 +一对一:任何一方的主键成为另一张表的外键 +一对多:用一的主键成为多的外键 +多对多:通过第三个表,使其转换为两个一对多 +rbac +好处:不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可。 +spu和sku +一、什么是SPU? +SPU是商品信息聚合的最小单位,描述了一个产品的特性。通俗讲,属性值、特性相同的商品就可以成为一个SPU +二、什么是SKU? +SKU即库存进出计量的单位,可以是以件、盒、托盘等为单位;例如纺织品中一个SKU通常表示:规格、颜色、款式 +三、SPU和SKU的区别? +举例:小明想要一台iphonexs,店员也会再继续问:想要什么iphonexs? 128G 银色?256G蓝色?每一台的iphone xs 的毛重都是420.00g,产地也都是中国大陆,这两个属性就属于SPU属性。而容量和颜色,这种会影响价格和库存的属性就是SKU属性 + +``` + +### 二、视图 + +```sql +一、为什么要有视图 +- 视图能够简化用户的操作; +- 视图使用户能以多种角度看待同一数据; +- 视图对重构数据库提供了一定程度的逻辑独立性; +- 视图能够对机密数据提供安全保护; +- 适当的利用视图可以更清晰的表达查询。 +二、视图与表的区别 +- 视图是一个虚拟表,基于查询结果而创建,不占用物理存储空间; +- 视图可以简化复杂查询和提供数据安全性,但不能直接存储数据 +- 表是实际存储数据的结构 +三、视图的好处 +- 可以重复利用 +- 安全性高 +- 减少网络开销 + +创建视图 视图本身就是一种sql语句,也是一种表的形式 +create view 视图名 as(表示从哪个表来) select 语句 from 表名 where 条件; +如:create view v_text1 as empno,ename,job from emp; + +如何分清视图与表:show full tables; +查看创表语句,能通过表名反查创表语句:show create table v_text1; +如何直接修改 v_text1?结构,多一个列:create or replace view v_text1 as select empno,ename,job ,sal from emp; +如何修改视图的名称,比如v_text1改成v_text2:rename table v_text1 to v_text2 +修改视图内容,将甘宁改成韦大力(成功修改了视图里的值,对应基表中的内容同步修改,但是不是每一次对视图的修改都能成功并且影响到基表) + +select * from v_text1 +update v_text1 set ename = '韦大力' where empno = 1001; +insert into v_text100 values (1015,'韦大力','马楼',1006,now(),3500,null,20) + +修改视图内容数据:能否修改,主要看视图的数据,是否与基表有对应, +1. 基表有非空字段,但视图不存在这字段, +2. 有聚合函数, +3. 有group by having,union,union all, +4. 有子查询, +5. 有join, +6. 有distinct, +7. 视图中有常量字段 + +总结: +改名:rename table 旧名 to 新 +修改结构:alter view 名称 as 新 select 语句 +create or replace view 名称 as 新select 语句 +删除视图:drop view if exists 名称 +``` + +### 三、存储过程 + +```sql +一、什么是存储过程(procedure)? +- 是实现经过编译并储存在数据库中的一段SQL语句集合。 +- 调用存储过程可以简化应用开发人员的很多工作,减少数据库和应用服务器之间的传输,对于提高数据处理的效率是很有好处的。 +- 存储过程就类似于JAVA中的方法需要先定义,使用时需要调用。存储过程可以定义参数,参数分为IN、OUT、 INOUT类型三种类型。 + +(1)如何查询现有的存储过程:show procedure status +如果要在特定数据库中显示存储过程:show procedure status where db='db_pro' +(2)如何调用已经写好的存储过程:call pro_table();当存储过程没有定义参数时即()里为空。在调用时,可以省略() +(3)删除一个存储过程 +drop procedure pro_table 删除过程不需要() + +``` + +### 四、存储函数 + +```sql +一、创建存储函数 +create function fun_name(参数名,类型) +returns 返回值类型 +deterministic/no sql/reads sql data +begin +sql代码 +return; +end; +二、调用存储函数 +其语法结构为:select fun_name(...); +三、修改存储函数 +drop function fun_name; +不能进行修改,如果想要改变就需要删除这个函数然后重新创建 +``` + +### 五、窗口函数 + +```sql +窗口函数(参数) over ( + partition by <用于分组的列名> + order by <用于排序的列名 ASC/DESC> + rows between 开始行 and 结束行 + ) + +partition by 子句用于指定分组列 rows between 子句用于指定窗口范围 + +窗口函数专用的排名函数 + +row_number():普通排名不会出现重复名次 + +rank():稀松排名,同数值会重复名次,会跳过名次 + +dense_rank:紧密排名,同数值会重复名次,不会跳过名次 + +聚合函数 + +如sum,avg,count,min,max等 + +lag用于统计窗口上一条记录的值或几条 + +lag(字段,N,默认值):取得该字段前N行的数据,如果为空用默认值替代 + +lead用于统计窗口中下一条记录的值 + +第一个值:first_value(expre) + +最后一个值last_value(expre) +小结 + +窗口函数可以保留原表的结构和行数 + +需要有over()子句 + +分组不用group by 改用partition by 写在over()里面 + +如果想要获得累计效果通过over()里面写order by + +over()可以不写(指括号里)表示对整个表进行运算 + +``` + +### 六、游标 + +1.声明游标 + +```sql +declare 游标名 cursor + +for select 字段1,字段2,from 表名 where 条件表达式; +``` + +2.打开游标 + +```sql +游标声明之后,需要用open语句来打开游标,以便开始访问结果及中国的数据 + +open 游标名称; +``` + +3.读取游标 + +```sql +fetch 游标名称 into 变量1,变量2,......; 读取到的数据被一次存入对应变量 +``` + +4.处理数据 + +```sql +在读取数据后,可以对变量中的数据进行各种处理操作,例如计算、更新、插入等。处理完一行数据之后,可以继续使用fetch语句读取下一行。 +``` + +5.关闭游标 + +```sql +当不再需要游标时,应使用close语句关闭游标,释放资源 + +close 游标名称; +``` + +### 七、触发器 + +#### 一、创建触发器语法 + +```sql +create trigger orders_tri(触发器名称) +before/ after (在触发时间之前或者之后) +insert / update / delete(触发事件) +on tri_table (触发事件的表名,只能是原始表不能是临时表) +for each row tri_sql(触发器被激活后执行的sql语句) +``` + +#### 二、触发事件 + +```sql +insert 事件会产生新一行用new 来表示这一行中的各个字段用new.字段名来调用 + +update 事件会对旧数据一行进行更新,产生新一行,用old来表示旧一行,new表示新一行 + +delete 事件只对旧数据进行删除,所以只用old来表示,要被删除的那行为旧数据 +``` + +#### 三、什么时候用begin和end + +```sql +当语句只有一行时,begin和end可以省略,同时适用于存储过程、函数 + +多行语句必须用begin和end包裹 +``` + +#### 四、主动报错和抛弃异常 + +```sql +signal sqlstate `可以为5个纯数字,纯英文(大写)` + +set ,message_text = `提示信息` +``` + +### 八、事物 + +```sql +一、什么是事物? +事务就是由一条或者多条 SQL 命令组成的逻辑工作单元。作为一个整体,这些SOL命令相互依赖、不可分割,只要一条SQL 命令执行失败,前面已经成功执行的 SQL 命令就会撤销,回退到事务开始前的状态。 + +二、一般而言,支持事务的数据库必须拥有以下4个特性 +(1)原子性(Atomicity):事务中多条SQL语句作为一个整体被执行,事务中的全部操作要么全部成功执行,要么都不执行。 +(2)一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态,要么同时成功要么同时失败。 +(3)隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 +(4)持久性(Durability):已提交的事务对数据库的修改应该永久保存在数据库中。 +简而言之,事务就是一组SQL命令的批处理,但这个批处理是一个原子(整体),不能分割,要么都执行,要么都不执行。 + +关闭自动提交语法 +set @@autocommit=0; -- 将系统变量中的自动提交改为禁用 +start transaction命今用于显式地开启事务。 +ROLLBACK 命令用于回滚事务所做的修改,并结束当前这个事务 + +除了撤销整个事务,用户还可以使用 ` ROLLBACK TO [保存点名称]`命令将事务回滚到某个保存点。但这需要事先使用 SAVEPOINT命令设置保存点。SAVEPOINT 命令的语法格式如下: +SAVEPOINT 保存点名字; +例如 +savepoint s1;s1即为保存点的名字 +要将事物回滚到` s1 `这个保存点:ROLLBACK to s1; +release savepiont s1;删除s1这个保存点 +``` + +### 九、综合练习 + +```sql +#准备数据 +drop database if exists LibraryDb; +create database LibraryDb; +use LibraryDb; +/* + 学生表 +*/ +CREATE TABLE Student ( + StudentCode varchar(8) primary key, -- 学号 + StudentName varchar(20) NOT NULL, -- 姓名 + Gender int DEFAULT NULL, -- 性别 + Birthday date DEFAULT NULL, -- 出生年月 + School varchar(20) DEFAULT NULL, -- 学院 + Major varchar(20) DEFAULT NULL -- 专业 +); + +/* + 学生扩展信息表 +*/ +CREATE TABLE StudentExtInfo( + StudentCode varchar(8) primary key , -- 学号 + Hobby varchar(120) DEFAULT NULL, -- 爱好 + Speciality varchar(120) DEFAULT NULL, -- 特长 + OriginPosition varchar(16) DEFAULT NULL, -- 生源地 + Prize int DEFAULT NULL -- 荣誉数 +); + +/* + 图书信息表 +*/ +CREATE TABLE BookInfo ( + ISBN varchar(13) primary key, -- ISBN + BookName varchar(32) DEFAULT NULL, -- 图书名 + Author varchar(32) DEFAULT NULL, -- 作者 + Publishing varchar(32) DEFAULT NULL, -- 出版社 + PublishedTime date DEFAULT NULL, -- 出版时间 + Introduce varchar(200) DEFAULT NULL, -- 书籍简介 + Catery varchar(8) DEFAULT NULL, -- 书籍分类 + Price decimal(10,2) DEFAULT NULL -- 书籍价格 +); + +/* + 图书类别表 +*/ +CREATE TABLE BookExtInfo( + Barcode varchar(9) primary key, -- barcode + ISBN varchar(13) , -- ISBN + BookStatus bit default null -- 状态 +); + +/* + 学生借阅信息 +*/ +CREATE TABLE BorrowRecord( + Id int primary key , -- 借阅id + StudentCode varchar(8) , -- 学号 + Barcode varchar(9) , -- barcode + BorrowTime datetime DEFAULT NULL, -- 借书时间 + ReturnTime datetime DEFAULT NULL -- 还书时间 +); + +insert into Student values('16100101','马诗',1,'1998-03-16','理学院','统计'); +insert into Student values('16130201','博文',0,'1998-04-24','信息学院','计算机科学与技术'); +insert into Student values('16130203','魏波',1,'1998-10-29','信息学院','计算机科学与技术'); +insert into Student values('16130205','黄弘',1,'1998-08-06','信息学院','数据科学与大数据技术'); +insert into Student values('17100104','易高明',0,'1999-05-29','理学院','信息与计算科学'); +insert into Student values('17100105','万承承',0,'1999-09-11','理学院','信息与计算科学'); +insert into Student values('17110101','黄弘',0,'2000-07-25','文法学院','法学'); +insert into Student values('17130202','邹睿睿',1,'1998-06-29','信息学院','计算机科学与技术'); +insert into Student values('17130204','马又云',1,'1999-03-27','信息学院','数据科学与大数据技术'); +insert into Student values('18100103','邓承明',1,'2000-07-25','理学院','信息与计算科学'); + + +insert into StudentExtInfo values('16100101','听音乐','艺术特长','北京',2); +insert into StudentExtInfo values('16130201','看小说',null,'湖南',3); +insert into StudentExtInfo values('16130203','硬笔书法','艺术特长','新疆',1); +insert into StudentExtInfo values('16130205','听音乐','艺术特长','北京',2); +insert into StudentExtInfo values('17100104','打篮球',null,'北京',3); +insert into StudentExtInfo values('17100105','编程','科技特长','北京',2); +insert into StudentExtInfo values('17110101','打篮球','科技特长','河北',2); +insert into StudentExtInfo values('17130202','编程','科技特长','天津',3); +insert into StudentExtInfo values('17130204','看电影',null,'北京',1); +insert into StudentExtInfo values('18100103',null,null,'河南',null); + + +insert into BookInfo values('7040409659','大学计算机','李凤霞','高等教育出版社','2014-10-21','教育部大学计算机课程改革项目规划教材','TP',28); +insert into BookInfo values('7301046065','刑法学','高明轩','北京大学出版社','2000-10-21','刑法_法学高等学校中国教材','O',69); +insert into BookInfo values('7806553312','射雕英雄传','金庸','广州出版社','2018-10-21','金庸作品集','I',67.9); +insert into BookInfo values('9788020002207','红楼梦','曹雪芹','人民文学出版社','2008-10-21','学术研究或个人阅读都非常合适','I',31.25); +insert into BookInfo values('9787113254100','Python语言及其应用','赵广辉','中国铁道出版社','2019-10-21','本书介绍Python语言的基础知识及其在各个领域的具体应用','TP',62.2); +insert into BookInfo values('9787115266156','管理信息系统实用教程(第2版)','王若宾','人民邮电出版社','2012-10-21','普通高等教育\十一五\国家级规划教材','TP',36); +insert into BookInfo values('9787115356840','管理信息系统实用教程(第3版)','王若宾','人民邮电出版社','2015-10-21','普通高等教育\十一五\国家级规划教材','TP',45); +insert into BookInfo values('9787302252955','人工智能:一种现代的方法(第3版)','黄今夏','清华大学出版社','2011-10-21','《人工智能:一种现代的方法(第3版)》为大学计算机教育著名教材系列之一','TP',132.6); +insert into BookInfo values('9787513030953','信息论','田甜','知识产权出版社','2015-10-21','文理科公选课指定教材','TP',126); +insert into BookInfo values('9787569302585','计算统计(第2版)','冯新奇','西安交通大学出版社','2018-10-21','本书涵盖了计算统计的所有核心内容','TP',67.5); +insert into BookInfo values('9789113268712','新编数据库技术','王若宾','中国铁道出版社','2018-10-21','本书重构了课程内容结构','TP',38.5); + + +insert into BookExtInfo values('O924.01','7301046065',0); +insert into BookExtInfo values('O924.02','7301046065',1); +insert into BookExtInfo values('O924.03','7301046065',1); +insert into BookExtInfo values('I13.212','9788020002207',1); +insert into BookExtInfo values('I13.213','9788020002207',1); +insert into BookExtInfo values('I247.56','7806553312',1); +insert into BookExtInfo values('I247.59','7806553312',0); +insert into BookExtInfo values('TP122.32','9787569302585',1); +insert into BookExtInfo values('TP122.33','9787569302585',1); +insert into BookExtInfo values('TP311.11','9787113254100',1); +insert into BookExtInfo values('TP311.12','9787113254100',0); +insert into BookExtInfo values('TP311.13','9787115356840',1); + + +insert into BorrowRecord values(1,'16130203','I247.56','2019-04-09','2019-04-13'); +insert into BorrowRecord values(2,'17130204','I247.56','2019-04-15','2019-04-17'); +insert into BorrowRecord values(3,'16130205','I247.59','2019-04-17','2019-04-20'); +insert into BorrowRecord values(4,'16100101','I247.56','2019-04-17','2019-04-18'); +insert into BorrowRecord values(5,'17100105','TP311.11','2019-04-29',null); +insert into BorrowRecord values(6,'16130201','I247.59','2019-05-01','2019-05-20'); +insert into BorrowRecord values(7,'17130202','TP311.12','2019-05-03',null); +insert into BorrowRecord values(8,'18100103','I13.212','2019-05-04','2019-05-15'); +insert into BorrowRecord values(9,'18100103','I13.213','2019-05-20','2019-05-30'); +insert into BorrowRecord values(10,'17110101','O924.01','2019-05-25',null); + +select * from Student; +select * from StudentExtInfo; +select * from BookInfo; +select * from BookExtInfo; +select * from BorrowRecord; +``` + +**第一题** + +```sql +1.1. (10分) 对学生姓名创建普通索引(`idx_StudentName`) +create index idx_StudentName on student(StudentName); + +1.2. (10分) 创建视图`V_StudentHobbyInfo`,其中包含姓名(`StudentName`),爱好(`Hobby`),特长(`Speciality`)列,并分别取别名为`vw_StudentName`,`vw_Hoppy`,`vw_Speclitiy +create view V_StudentHobbyInfo as +select st.StudentName vw_StudentName ,sti.Hobby vw_Hoppy,sti.Speciality vw_Speclitiy +from studentextinfo sti join student st on st.StudentCode = sti.StudentCode; + +1.4. (5分) 查询学生`马又云`的生源地,要求显示:姓名(`StudentNameame`),生源地(`OriginPosition`) +select StudentName,OriginPosition from studentextinfo sti join student st on st.StudentCode = sti.StudentCode where StudentName = '马又云'; + +1.5. (5分) 查询学生表(`StudentInfo`)中还未还书的读者的学号(`StudentCode`)和姓名(`StudentName`),以及借书时间(`BorrowTime`) +select st.StudentCode,st.StudentName,bc.BorrowTime from student st join borrowrecord bc on st.StudentCode = bc.StudentCode where bc.ReturnTime is null; + +1.6. (5分) 查询借阅过书籍《射雕英雄传》的学生,要求显示:学生姓名(`StudentName`),学院(`School`),图书名(`BookName`),借阅时间(`BorrowTime`) +select st.StudentName,st.School,bf.BookName,bo.BorrowTime from +bookextinfo bi +join borrowrecord bo on bo.Barcode = bi.Barcode +join bookinfo bf on bf.ISBN = bi.ISBN +join student st on st.StudentCode = bo.StudentCode +where bf.BookName = '射雕英雄传'; +``` + +**第二题** + +```sql +#准备数据 +create database db_room; +use db_room; +drop table if exists b_room; + +drop table if exists doctor; + +drop table if exists k_room; + +drop table if exists patient; + +/*==============================================================*/ +/* Table: b_room */ +/*==============================================================*/ +create table b_room +( + kroom_id int not null, + broom_id int not null, + bed_id int, + kroom_name varchar(40), + primary key (broom_id) +); + +/*==============================================================*/ +/* Table: doctor */ +/*==============================================================*/ +create table doctor +( + doc_name varchar(10), + doc_job varchar(40), + kroom_name varchar(40), + age int, + job_id int not null, + kroom_id int not null, + primary key (job_id) +); + +/*==============================================================*/ +/* Table: k_room */ +/*==============================================================*/ +create table k_room +( + kroom_id int not null auto_increment, + kroom_name varchar(40), + room_address varchar(255), + room_phone varchar(255), + doctor_name varchar(20), + primary key (kroom_id) +); + +/*==============================================================*/ +/* Table: patient */ +/*==============================================================*/ +create table patient +( + patient_id int not null, + patient_name varchar(10), + gender char(2), + message varchar(255), + doctor_name varchar(20), + paroom_id int, + job_id int not null, + primary key (patient_id) +); + +alter table b_room add constraint FK_kroom_broom foreign key (kroom_id) + references k_room (kroom_id) on delete restrict on update restrict; + +alter table doctor add constraint FK_kroom_doctor foreign key (kroom_id) + references k_room (kroom_id) on delete restrict on update restrict; + +alter table patient add constraint FK_doctor_patient foreign key (job_id) + references doctor (job_id) on delete restrict on update restrict; + +INSERT INTO `doctor` VALUES ('钱一', '牙科专家', '牙科', 30, 10011, 1); +INSERT INTO `doctor` VALUES ('赵尔', '急诊科主刀医师', '急诊科', 41, 10012, 2); +INSERT INTO `doctor` VALUES ('韦大力', '骨科大夫', '骨科', 26, 10013, 3); +INSERT INTO `doctor` VALUES ('孙隼', '妇产科专家', '妇产科', 38, 10014, 4); + +INSERT INTO `patient` VALUES (101, '刘无', '男', '根管治疗', '钱一', 2001, 10011); +INSERT INTO `patient` VALUES (102, '吴语', '男', '脑溢血', '赵尔', 1002, 10012); +INSERT INTO `patient` VALUES (103, '叶青', '女', '骨折', '韦大力', 3005, 10013); +INSERT INTO `patient` VALUES (104, '叶籽', '女', '生产', '孙隼', 4003, 10014); + +INSERT INTO `b_room` VALUES (1, 2001, 10, '牙科'); +INSERT INTO `b_room` VALUES (2, 1002, 20, '急诊科'); +INSERT INTO `b_room` VALUES (3, 3005, 30, '骨科'); +INSERT INTO `b_room` VALUES (4, 4003, 40, '妇产科'); + +INSERT INTO `k_room` VALUES (1, '牙科', '二楼', '1885654', '钱一'); +INSERT INTO `k_room` VALUES (2, '急诊科', '一楼', '1472589', '赵尔'); +INSERT INTO `k_room` VALUES (3, '骨科', '三楼', '258369', '韦大力'); +INSERT INTO `k_room` VALUES (4, '妇产科', '四楼', '159357', '孙隼'); +``` + +题目: + +2.1. (10分)其中,一个科室有多个病房、多个医生;一个病房只能属于一个科室,一名医生只属于一个科室,但可负责多名病人的诊治,一个病人的主主治生只有一个。科编号是标识列,从1开始自增长,步进值为1,医生职称有:实习,初级,中级,高级。 +请设计该表关系模式结构(数据库物理模型),要求: + + a. 中文名和英文名称清晰(可借助有道翻译工具,不允许开网页) + b. 表关系准确,包括主键,外键,标识列 + c. 将完成的设计截图,并且保存物理模型文件,命名为恰当的名称 + d. 将截图和物理模型文件放在自己的文件夹中 + +![image-20241021220310289](https://gitee.com/gcxxl/note-sheet-bed/raw/master/images/202410212203350.png) + +```sql +2.2. (10分)创建存储过程实现:传入病历号,查询其对应的主治医生及其所在的病房号、床位号。 +drop if EXISTS pro_patient; +delimiter// +create procedure pro_patient(in pa_id int) +begin +select doc_name,broom_id,bed_id +from k_room kr join doctor doc on doc.kroom_id = kr.kroom_id +join patient pa on pa.job_id = doc.job_id +join b_room br on br.kroom_id = kr.kroom_id +where patient_id = pa_id; +end// +delimiter; +call pro_patient(103); + +2.3. (10分)创建触发器实现:当医生离职时,检查其是否还有未完成医治的病人,如果还存在病人则不予离职,否则可以离职。 +create trigger tri_leave before delete on doctor +for each ROW +begin +declare patient_count int; +select cout(*) into patient_count from patient where doctor_name = old.doctor_name ; +IF patient_count > 0 then + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = '无法离职:仍有未完成的病人!'; +end if; +end ; +错误 +``` + -- Gitee