数据库课程设计报告
高校学生宿舍管理系统
目录
(一)实验目的 3
(二) 软硬件环境 3
mysql-8.0.22-winx64、Webyog SQLyog 3
(三)实验设计简述 3
(四)系统需求分析 3
1. 管理员 3
2. 校区 3
3. 楼栋 4
4. 楼栋管理员 4
5. 宿舍 4
6. 宿舍报修 4
7. 学生 4
(五)概念模型设计 4
1. 管理员信息 4
2. 校区信息 5
3. 楼栋信息 5
4. 楼栋管理员信息 5
5. 宿舍信息 5
6. 宿舍报修信息 5
7. 学生信息 5
(六)逻辑模型设计 5
(七)物理模型设计 6
1.存储记录结构设计 6
2.建立索引 9
3. 建立视图 9
(八)表的创建 10
1. 建表sql语句 10
2. 实现列、行及参照完整性 12
(九)实验数据示例:测试 13
1. 数据操纵(增) 13
2.数据操纵(改) 19
3. 数据操纵(查) 19
(十)设计存储过程、函数、触发器 22
1. 设计存储过程 22
2. 函数 24
3. 触发器 26
(一)实验目的
作为一名大学在校生,发现学校的宿舍管理模式依旧是以前的用纸笔登记记录,对于师生、宿管使用起来,学校管理极其不方便,于是我们希望开发一个高校宿舍管理系统,本文主要是对数据库的设计、测试及可行性分析。最终实现疫情当下的“网上解决问题”的愿望,以及方便宿舍管理人员的工作和广大学生,提高其工作效率。
根据高校学生宿舍管理系统的要求,通过系统需求分析、概念模型设计、逻辑模型设计、物理模型设计等全过程完成高校宿舍管理系统的数据库设计。
(二)软硬件环境
mysql-8.0.22-winx64、Webyog SQLyog
(三)实验设计简述
宿舍管理系统主要是通过提供高校的学生信息和宿舍管理信息之间的关系,建立一个高效率的宿舍管理系统。其中包括校区信息、楼栋信息、宿舍信息、学生信息、楼栋管理员信息以及宿舍事故信息。该系统可以通过学生信息的查找快速找到学生所对应的宿舍信息,以及宿舍所有的信息。还包括学生信息的添加、修改、删除及查询等以及宿舍信息的添加、删除、修改、查询。可以通过查找楼栋查找该楼所包含的所有学生信息,反之,通过学生信息也可以查找到学生所在宿舍楼及宿舍号的信息。
后续我们将准备使用Redis,key-value数据库进行改进,因为Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
另外,创建了一张系统管理员表,默认管理员类型type默认为0(一般管理员),其中设置一个管理员类型type值为1(超级管理员)。在后续的改进中预计会加入多种功能,超级管理员会给一般管理员进行权限管理。
(四)系统需求分析
1.管理员
每位系统管理员都有自己的账号,密码。当该系统出现系统故障或者需要维修时,系统管理员可以通过自己的账号、密码登陆到系统对系统漏洞进行维修管理。
2.校区
学校会分为两个校区,每个校区都会有校区id、校区全称、地址、电话、邮编号等。
3.楼栋
每栋楼都标有宿舍楼的号码,而每栋楼都有相应的楼层数目以及寝室数目。
4.楼栋管理员
每栋宿舍楼的楼栋管理员可以通过系统对学生信息、宿舍楼信息、宿舍信息、宿舍事故信息及时添加、删除、查询及修改。而且学生如果在宿舍中有问题要找宿舍管理员反馈,为了方便快捷可以通过该系统查询到管理员的信息及时进行反馈。
5.宿舍
宿舍做为该系统中与学生联系密切的一个主体主要还包含了这些信息:宿舍号,舍长,所在楼号,所在层数,总床位数,实际人数,空余床位,是否有空调,是否单独卫浴等,可以通过该系统查找每个宿舍中每位学生的个人信息。
6.宿舍报修
如果有宿舍的硬件设施出现问题,则宿舍舍长可以通过该系统填报宿舍信息以及宿舍保修信息。而最终的结果也会分为两种:
一、问题解决,则会有系统提示已解决;
二、问题未解决,则会显示“问题正在处理”。
7.学生
可以通过该系统查询到学生自己的信息核对自己的信息是否在宿舍管理系统中添加成功,如果没有添加成功或者添加信息有误则可以通过查找联系宿舍管理人员对其信息进行修改。若是宿舍出现突发事故或是有什么紧急情况,可以通过该系统查询校区信息,在该系统中拨打校园报警电话。各宿舍舍长通过宿舍信息可以及时查询,监督校内签到查寝等多个功能。
(五)概念模型设计
数据库需要表述的信息有以下几种:
1.管理员信息
2.校区信息
3.楼栋信息
4.楼栋管理员信息
5.宿舍信息
6.宿舍报修信息
7.学生信息

E-R模型
(六)逻辑模型设计
通过ER模型到关系模型的转化,可以得到如下关系模式:
(1)系统管理员转换 关系:admin(id,account,password,new_file_name,old_file_name,type)
(2)校区信息转换为 关系:campus_info(id,name,address,phone,email)
(3)楼栋实体集转换为 关系:build_info(id,number,name,floor_number,dorm_number,campusid)
(4)楼栋管理员信息转换为 关系:build_admin_info(id,name,sex,phone,dormid,buildid)
(5)宿舍信息转换为 关系:dorm_info(id,number,chief,floor,bed_number,actual_number,freebed,air_conditioner,remark,buildid,build_adminid)
(6)宿舍报修信息转换为 关系:repair_info(id,type,time,reason,solution,remark,dormid)
(7)学生信息转换为 关系:student_info(id,name,number,sex,grade,faculty,major,class,phone,enter_time,state,feedback,dormid)
每个关系模式的主键码都用加粗并用下划线标出。

关系模型
一个校区信息有n个楼栋信息,一个楼栋信息包含n个宿舍信息,同时也有一个楼栋管理员信息,一个楼栋管理员可以管理n个宿舍信息,n个宿舍信息能反馈n个保修信息,同时一个宿舍信息包含n个学生信息。
(七)物理模型设计
1.存储记录结构设计

表名:admin
属 性 含义 数据类型/范围 备注
id 管理员(主键) int(10)
account 账号 varchar(100)
password 密码 varchar(100)
new_file_name 新头像名 varchar(100)
old_file_name 旧头像名 varchar(100)
type 类型 int 0默认为一般管理员

表名:campus_info
属 性 含义 数据类型/范围 备注
id 校区id(主键) int(10)
name 校区全称 varchar(100)
address 校区地址 varchar(100)
phone 电话 varchar(11)
email 邮编号 varchar(100)

表名:build_info
属 性 含义 数据类型/范围 备注
id 楼栋id(主键) int(10)
number 楼号 varchar(100)
name 楼名 varchar(100)
floor_number 总层数 varchar(100)
dorm_number 总宿舍数 varchar(100)
campusid 所属校区(外键) int

表名:build_admin_info
属 性 含义 数据类型/范围 备注
id 楼栋管理员id(主键) int(10)
name 姓名 varchar(10)
sex 性别 char(1)
phone 电话 varchar(11)
dormid 所属宿舍(外键) int
buildid 所管理的楼栋(外键) int

表名:dorm_info
属 性 含义 数据类型/范围 备注
id 宿舍id(主键) int(10)
number 宿舍号 varchar(10)
chief 舍长 varchar(10)
floor 所在层数 varchar(100)
bed_number 总床位数 varchar(100)
actual_number 实际人数 varchar(100)
freebed 空余床位 varchar(100)
air_conditioner 是否有空调 char(1) 是/否
remark 备注 text
buildid 所属楼栋(外键) int(10)
build_adminid 所属楼管管理 int(10)

表名:repair_info
属 性 含义 数据类型/范围 备注
id 报修记录id(主键) int(10)
type 报修类型 varchar(100)
time 保修时间 datetime
reason 报修原因 varchar(100)
solution 解决情况 varchar(100)
remark 备注 text
dormid 所属宿舍(外键) int(10)

表名:student_info
属 性 含义 数据类型/范围 备注
id 学生id(主键) int(10)
name 姓名 varchar(10)
number 学号 varchar(100)
sex 性别 char(1)
grade 年级 varchar(100)
faculty 院系 varchar(100)
major 专业 varchar(100)
class 班级 varchar(100)
phone 联系电话 varchar(11)
enter_time 入住时间 datetime
state 在校状态 varchar(10)
feedback 意见反馈 varchar(100)
dormid 所属宿舍(外键) int(10)

2.建立索引
为了提高在表中搜索元组的速度,在实际实现的时候应该基于键码建立索引是各表中建立索引的表项:
(1)admin(id)
(2)campus_info(id)
(3)build_info(id,campusid)
(4)build_admin_info(id,dormid,buildid)
(5)dorm_info(id,buildid,build_adminid)
(6)repair_info(id,dormid)
(7)student_info(id,dormid)
3.建立视图
– 定义视图(查看陕西理工大学南校区的30岁以下楼栋管理员和他们的所属楼栋和宿舍号)

CREATE VIEW sel_build_admin_info ASSELECTba.name '楼栋管理员姓名',ba.sex,ba.age,ba.phone,d.number '宿舍号',b.name '楼栋名'FROMbuild_admin_info ba,dorm_info d,build_info bWHERE ba.dormid = d.idAND ba.buildid = b.idAND age <= 30

– 使用视图sel_build_admin_info

SELECT * FROM sel_build_admin_info


(八)表的创建
1.建表sql语句
– 创建宿舍管理系统数据库(DMS Database)

CREATE DATABASE IF NOT EXISTS dms_db CHARSET utf8;

– 创建系统管理员表

CREATE TABLE admin (id INT PRIMARY KEY AUTO_INCREMENT,account VARCHAR (100),PASSWORD VARCHAR (100),new_file_name VARCHAR (20),old_file_name VARCHAR (20),TYPE INT DEFAULT0)

– 创建校区信息表

CREATE TABLE campus_info (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR (100),address VARCHAR (100),phone VARCHAR (11),email VARCHAR (100))

– 创建楼栋信息表

CREATE TABLE build_info (id INT PRIMARY KEY AUTO_INCREMENT,number VARCHAR (100),NAME VARCHAR (100),floor_number VARCHAR (100),dorm_number VARCHAR (100),campusid INT)

– 创建楼栋管理员表

CREATE TABLE build_admin_info (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR (10),sex CHAR (1),phone VARCHAR (11),dormid INT,buildid INT)

– 创建宿舍信息表

CREATE TABLE dorm_info (id INT PRIMARY KEY AUTO_INCREMENT,number VARCHAR (10),chief VARCHAR (10),FLOOR VARCHAR (100),bed_number VARCHAR (100),actual_number VARCHAR (100),freebed VARCHAR (100),air_conditioner CHAR (1),remark TEXT,buildid INT,build_adminid INT)

– 创建报修表

CREATE TABLE repair_info (id INT PRIMARY KEY AUTO_INCREMENT,TYPE VARCHAR (100),TIME DATETIME,reason VARCHAR (100),solution VARCHAR (100),remark TEXT,dormid INT)

– 创建学生信息表

CREATE TABLE student_info (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR (10),number VARCHAR (100),sex CHAR (1),grade VARCHAR (100),faculty VARCHAR (100),major VARCHAR (100),class VARCHAR (100),phone VARCHAR (11),enter_time DATETIME,state VARCHAR (10),feedback VARCHAR (100),dormid INT)

2.实现列、行及参照完整性
– 添加外键约束:
– ALTER TABLE 表名 ADD [CONSTRAINT 约束名(FK_主表_从表)] FOREIGN KEY(外键列) REFERENCES关联表(主键);
– 把楼栋信息表中campusid与校区信息表中的id关联,campusid作为外键

ALTER TABLE build_infoADD CONSTRAINT fk_campus_info_build_info FOREIGN KEY (campusid) REFERENCES campus_info (id)

– 把楼栋管理员信息表中buildid与楼栋信息表中的id关联,buildid作为外键

ALTER TABLE build_admin_infoADD CONSTRAINT fk_build_info_build_admin_info FOREIGN KEY (buildid) REFERENCES build_info (id)

– 把楼栋管理员信息表中dormid与宿舍信息表中的id关联,dormid作为外键

ALTER TABLE build_admin_infoADD CONSTRAINT fk_dorm_info_build_admin_info FOREIGN KEY (dormid) REFERENCES dorm_info (id)

– 把宿舍信息表中buildid与楼栋信息表中的id关联,buildid作为外键

ALTER TABLE dorm_infoADD CONSTRAINT fk_build_info_dorm_info FOREIGN KEY (buildid) REFERENCES build_info (id)

– 把宿舍信息表中build_adminid与楼栋管理员信息表中的id关联,build_adminid作为外键

ALTER TABLE dorm_infoADD CONSTRAINT fk_build_admin_info_dorm_info FOREIGN KEY (build_adminid) REFERENCES build_admin_info (id)

– 把报修信息表中dormid与宿舍信息表中的id关联,dormid作为外键

ALTER TABLE repair_infoADD CONSTRAINT fk_dorm_info_repair_info FOREIGN KEY (dormid) REFERENCES dorm_info (id)

– 把学生信息表中dormid与宿舍信息表中的id关联,dormid作为外键

ALTER TABLE student_infoADD CONSTRAINT fk_dorm_info_student_info FOREIGN KEY (dormid) REFERENCES dorm_info (id)

(九)实验数据示例:测试
1.数据操纵(增)
1)– 插入系统管理员,账号admin,密码111

INSERT INTO admin (account, PASSWORD)VALUES('admin', '111')

2)– 插入校区信息

INSERT INTO campus_info (NAME, address, phone, email)VALUES('陕西理工大学南校区','陕西省汉中市汉台区东一环路1号','09162641533','723000'),('陕西理工大学北校区','陕西省汉中市勉县褒城镇226县道','09162291022','724206'),('清华大学','北京市海淀区双清路30号','01062770334','123450'),('北京大学','北京市海淀区颐和园路5号','01062752114','123451')


3)– 插入陕西理工大学南校区与北校区楼栋信息

INSERT INTO build_info (number, NAME, floor_number, dorm_number, campusid)VALUES('1#','学生公寓1号楼','4','128',1),('2#','学生公寓2号楼','4','128',1),('10#','学生公寓10号楼','6','192',1),('13B#','学生公寓13B号楼','17','425',1),('14#','学生公寓14号楼','6','192',2),('15#','学生公寓15号楼','6','192',2),('16#','学生公寓16号楼','6','192',2),('甲一楼#','学生公寓甲一楼','6','192',2),('甲二楼#','学生公寓甲二楼','6','192',2)


4)– 插入陕西理工大学南校区学生公寓10号楼(2个管理员)与学生公寓13B号楼(4个管理员)的楼栋管理员信息

INSERT INTO build_admin_info (NAME, sex, phone, dormid, buildid)VALUES('张翠花','女','1345678901',1,3),('雷牡丹','女','1345678902',2,3),('栓科','男','1345678903',3,4),('栓怀','男','1345678904',4,4),('检科','男','1345678905',5,4),('检怀','男','1345678906',6,4)


– 插入陕西理工大学南校区学生公寓10号楼与学生公寓13B号楼的楼栋管理员的宿舍信息,当插入楼栋管理员时,将dorm_info表中的chief设置为0,代表楼栋管理员宿舍无舍长chief

INSERT INTO dorm_info (number,chief,FLOOR,bed_number,buildid,build_adminid)VALUES(101,'0', '1楼', '1张', 3, 1),(501, '0','5楼', '1张', 3, 2),(101, '0','1楼', '1张', 4, 3),(601, '0','6楼', '1张', 4, 4),(1101,'0', '11楼', '1张', 4, 5),(1601,'0', '16楼', '1张', 4, 6)


5)– 插入陕西理工大学南校区学生公寓10号楼与学生公寓13B号楼的学生的宿舍信息

INSERT INTO dorm_info (number,chief,FLOOR,bed_number,actual_number,freebed,air_conditioner,buildid,build_adminid)VALUES(102,'张翠朵','1楼','8张','7人','1张','是',3,1),(201,'张花朵','2楼','8张','6人','2张','是',3,1),(528,'张翠翠','5楼','8张','7人','1张','是',3,2),(119,'张建国','1楼','6张','6人','0张','是',4,3),(520,'张建家','5楼','6张','6人','0张','是',4,3),(625,'张建富','6楼','6张','6人','0张','是',4,4),(808,'张建强','8楼','6张','6人','0张','是',4,4),(1202,'张建繁','12楼','6张','6人','0张','是',4,5),(1514,'张建荣','15楼','6张','6人','0张','是',4,5),(1616,'张建昌','16楼','6张','6人','0张','是',4,6),(1701,'张建盛','17楼','6张','6人','0张','是',4,6)


6)– 插入报修信息(陕西理工大学南校区学生公寓10号楼102和528宿舍报修)

INSERT INTO repair_info (TYPE,TIME,reason,solution,remark,dormid)VALUES('水电',NOW(),'洗手间漏水','未解决','请来一位身高比较高的,因为比较损坏位置比较高',7),('工程',NOW(),'工程损坏','已解决','请及时处理',9),('空调维修',NOW(),'空调制热效果不明显','未解决',',叔叔,孩子快冻坏了,快来鸭!!!',9)


7)– 插入学生信息
– 插入学生公寓10号楼528宿舍的学生信息

INSERT INTO student_info (NAME,number,sex,grade,faculty,major,class,phone,enter_time,state,feedback,dormid)VALUES('张翠翠','1909064028','女','2019级','数计学院','信计','1901班','18766886688','2019-09-01 08:00:00','在校','学校环境优美',9),('张翠翠1','19090640281','女','2019级','数计学院','信计','1901班','18766886681','2019-09-01 08:00:00','在校','学校环境优美',9),('张翠翠2','19090640282','女','2019级','数计学院','信计','1901班','18766886682','2019-09-01 08:01:00','在校','学校环境优美',9),('张翠翠3','19090640283','女','2019级','数计学院','信计','1902班','18766886683','2019-09-01 09:00:00','在校','学校环境优美',9),('张翠翠4','19090640284','女','2019级','数计学院','信计','1902班','18766886684','2019-09-01 12:00:00','在校','学校环境优美',9),('张翠翠5','19090640285','女','2019级','数计学院','信计','1902班','18766886685','2019-09-01 08:05:00','在校','学校环境优美',9),('张翠翠6','19090640286','女','2019级','数计学院','信计','1903班','18766886686','2019-09-01 08:10:00','在校','学校环境优美',9)

– 插入学生公寓13号楼1203宿舍的学生信息(假设宿舍共有8人,需要先查询1203宿舍的宿舍信息,发现没有1203宿舍信息,于是插入1203宿舍信息,再插入1203宿舍的学生信息)
– 1、先查询1203宿舍的宿舍信息(目前查询结果未null)

SELECT * FROM dorm_info WHERE number = 1203

– 2、插入1203宿舍信息

INSERT INTO dorm_info (number,chief,FLOOR,bed_number,actual_number,freebed,air_conditioner,buildid,build_adminid)VALUES(1203,'张大大','12楼','8张','8人','0张','是',4,5)-- 插入1203宿舍的学生信息INSERT INTO student_info (NAME,number,sex,grade,faculty,major,class,phone,enter_time,state,feedback,dormid)VALUES('张大大','1901064000','男','2019级','体育学院','体教','1901班','17733669900','2019-09-02 13:00:00','在校摸鱼','学校环境优美',18),('张吉吉','1901064001','男','2019级','体育学院','体教','1901班','17733669901','2019-09-01 08:00:00','请假约会','学校环境优美',18),('张大大','1901064002','男','2019级','体育学院','体教','1902班','17733669902','2019-09-01 08:01:00','在校摸鱼','学校环境优美',18),('张利利','1901064003','男','2019级','体育学院','体教','1902班','17733669903','2019-09-03 09:00:00','在校摸鱼','学校环境优美',18),('张恭恭','1901064004','男','2019级','体育学院','运训','1901班','17733669904','2019-09-01 12:00:00','关禁闭室','学校环境优美',18),('张喜喜','1901064005','男','2019级','体育学院','运训','1901班','17733669905','2019-09-02 08:05:00','在校摸鱼','学校环境优美',18),('张发发','1901064006','男','2019级','体育学院','运训','1902班','17733669906','2019-09-01 08:10:00','留校查看','学校环境优美',18),('张财财','1901064006','男','2019级','体育学院','运训','1902班','17733669907','2019-09-01 08:10:00','在校看戏','学校环境优美',18)


2.数据操纵(改)
– 修改系统管理员admin的类型0(系统管理员)为1(超级管理员)

UPDATE admin SET TYPE = 1 WHERE account = 'admin'

3.数据操纵(查)
1)查询插入的管理员信息:

SELECT * FROM admin


2)查询陕西理工的所有校区信息:

SELECT * FROM campus_info WHERE NAME LIKE '陕西理工大学%'


3)查询陕西理工大学南校区与北校区楼栋信息,查询结果要求显示该宿舍所属校区:

SELECTb.number,b.name '楼栋名',b.floor_number,b.dorm_number,c.name '所属校区'FROMbuild_info b,campus_info cWHERE b.campusid = c.id


4)查询陕西理工大学南校区学生公寓10号楼(2个管理员)与学生公寓13B号楼(4个管理员)的楼栋管理员信息,要求显示该管理员所属宿舍和管理的楼栋:

SELECTba.name '楼栋管理员姓名',ba.sex,ba.phone,d.number '宿舍号',b.name '楼栋名'FROMbuild_admin_info ba,dorm_info d,build_info bWHERE ba.dormid = d.idAND ba.buildid = b.id


5)查询陕西理工大学南校区学生公寓10号楼与学生公寓13B号楼的学生的宿舍信息,要求显示该宿舍所属楼栋和管理该宿舍的楼栋管理员姓名:

SELECTd.number,d.chief,d.floor,d.bed_number,d.actual_number,d.freebed,d.air_conditioner,d.remark,b.name '所属楼栋',ba.name '楼栋管理员姓名'FROMdorm_info d,build_info b,build_admin_info baWHERE d.buildid = b.idAND d.build_adminid = ba.idAND d.chief != '0'


6)查询陕西理工大学南校区学生公寓10号楼102和528宿舍报修记录,要求显示该宿舍宿舍号,舍长,该宿舍所属楼栋,所属校区:

SELECTr.id,r.type,r.time,r.reason,r.solution,r.remark,d.number '宿舍号',d.chief,b.name '所属楼栋',c.name '所属校区'FROMrepair_info rLEFT JOIN dorm_info dON r.dormid = d.idLEFT JOIN build_info bON d.buildid = b.idLEFT JOIN campus_info cON b.campusid = c.idWHERE c.name = '陕西理工大学南校区'AND b.name = '学生公寓10号楼'AND d.number = '102'OR '528'


7)①查询所有的学生信息:

SELECT * FROM student_info


②查询体育学院的所有学生信息,要求显示该生姓名,学号,性别,年级,学院,专业,在校状态,意见反馈。该生所属宿舍,舍长,楼栋名,所属校区名称。

SELECTs.name,s.number '学号',s.sex,s.grade,s.faculty,s.major,s.state,s.feedback,d.number '宿舍号',d.chief,b.name '所属楼栋',c.name '所属校区'FROMstudent_info sLEFT JOIN dorm_info dON s.dormid = d.idLEFT JOIN build_info bON d.buildid = b.idLEFT JOIN campus_info cON b.campusid = c.idWHERE s.faculty = '体育学院'


(十)设计存储过程、函数、触发器
1.设计存储过程
如果实现用户的某些需求时,需要编写一组复杂的 SQL 语句才能实现,那么可以将这组复杂的SQL 语句集编写在数据库中,由JDBC 调用来执行这组 SQL语句。把编写在数据库中的SQL 语句集称为存储过程。
存储过程(PROCEDURE)是事先经过编译并存储在数据库中的一段 SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
存储过程类似于JAVA 语言中的方法,需要先定义,使用时需要调用。存储过程可以定义参数,参数分为IN、OUT、INOUT 类型三种类型。IN类型的参数表示接收调用者传入的数据,OUT 类型的参数表示向调用者返回数据,INOUT类型的参数既可以接收调用者传入的参数,也可以向调用者返回数据。
1)– 查询陕西理工大学南校区有多少个楼栋(参数:parameter)

DELIMITER $$CREATE PROCEDURE build_count(IN p_campusid INT,OUT P_build_count INT)BEGINSELECT COUNT(*) INTO p_build_count FROM build_info WHERE campusid = p_campusid;SELECT p_build_count;END$$DELIMITER ;

– 在一个存储过程中调用另一个存储过程

CALL build_count (1, @p_build_count);


2)– 存储过程保存管理员,在存储过程中判断账号是否已经存储,不存在则存储,否则返回账号已存在

DELIMITER $$CREATE PROCEDURE save_admin(IN p_account VARCHAR(100),IN p_password VARCHAR(100),OUT p_result VARCHAR(100))BEGIN-- 声明一个变量,接收查询到的结果DECLARE v_count INT DEFAULT 0;SELECT COUNT(*) INTO v_count FROM admin WHERE account = p_account;IF v_count = 0 THENINSERT INTO admin(account,PASSWORD)VALUES(p_account,p_password);ELSESET p_result = "账号已存在";SELECT p_result;END IF;END$$DELIMITER ;

– 在存储过程中测试admin账号是否存在,存在:返回账号已存在;不存在:插入。

CALL save_admin('admin','111',@p_result);


– 在存储过程中测试admin1账号是否存在,存在:返回账号已存在;不存在:插入。

CALL save_admin('admin1','111',@p_result);


账号admin1插入成功:

2.函数
– 函数
1)– 其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

SET GLOBAL log_bin_trust_function_creators=TRUE;

– 创建函数admin_count

DELIMITER $$CREATEFUNCTION admin_count()RETURNS INTBEGINDECLARE v_count INT DEFAULT 0;SELECT COUNT(*) INTO v_count FROM admin;RETURN v_count;END$$DELIMITER ;

– 执行函数admin_count

SELECT admin_count();


2)– 创建函数p_admin_type,判断管理员为一般管理员还是超级管理员

DELIMITER $$CREATEFUNCTION findAdminType(p_admin_type INT)RETURNS VARCHAR(100)BEGINDECLARE v_admin_type VARCHAR(100) DEFAULT '';IF p_admin_type = 1 THENSET v_admin_type = '超级管理员';ELSESET v_admin_type = '管理员';END IF;RETURN v_admin_type;END$$DELIMITER ;

– 执行函数p_admin_type,查询admin表信息

SELECT id,account,findAdminType(TYPE) FROM admin;


3)– 创建函数findBuildName,在查询宿舍信息时,用函数查询出楼栋名字name

DELIMITER $$CREATEFUNCTION findBuildName(p_buildid INT)RETURNS VARCHAR(100)BEGINDECLARE v_build_name VARCHAR(100) DEFAULT '';SELECT NAME INTO v_build_name FROM build_info WHERE id = p_buildid;RETURN v_build_name;END$$DELIMITER ;

– 执行函数findBuildName,查询admin表信息

SELECT id,number,findBuildName(buildid) FROM dorm_info;


3.触发器
触发器(trigger)是一种特殊的存储过程,其特殊性在于它并不需要用户直接调用,而是在对表添加、修改、删除之前或者之后自动执行的存储过程。
触发器具有以下特点:
1.与表相关联
触发器定义在特定的表上,这个表称为触发器表。
2.自动激活触发器
当对表中的数据执行 INSERT、UPDATE 或 DELETE 操作时,如果对表上的这个特定操作定义了触发器,该触发器自动执行,这是不可撤销的。
3.不能直接调用
与存储过程不同,触发器不能被直接调用,也不能传递或接受参数。
4.作为事务的一部分
触发器与激活触发器的语句一起做为对一个单一的事务来对待,可以从触发器中的任何位置回滚。
– 触发器
– 搭建触发器案例:插入校区信息(陕西理工校区测试)、楼栋信息(知行楼#)

INSERT INTO campus_info (NAME, address, phone, email)VALUES('陕西理工校区测试','陕西汉中','09160001111','723000')INSERT INTO build_info (number,NAME,floor_number,dorm_number,campusid)VALUES('知行楼#','学生公寓知行楼','11','100',5)

删除之前的校区信息:

删除之前的楼栋信息:

– 比较:无触发器的情况,要直接删除校区信息是删除不掉的,因为校区信息表campus_info中关联了有一列为buildid,它关联了楼栋表里面的id,如果要删除校区信息,则必须先删除楼栋信息,即为至少写两个查询语句。
– 添加触发器的情况,添加一个触发器,在删除校区之前(before),先删除楼栋信息,再删除校区信息。

DELIMITER $$CREATETRIGGER delete_build BEFORE DELETEON campus_infoFOR EACH ROWBEGINDELETE FROM build_info WHERE campusid = old.id;END$$DELIMITER ;

– 删除校区id为5的陕西理工校区测试,由于已经添加触发器,所以添加的外键不会影响删除校区

DELETE FROM campus_info WHERE id = 5;

删除之后的校区信息:

删除之后的楼栋信息:

– 创建一个管理员日志表admin_log

CREATE TABLE admin_log (id INT PRIMARY KEY,account VARCHAR (100),oper_time DATETIME)

– 向admin表中插入数据时,就向admin_log表中插入一条日志记录

DELIMITER $$CREATETRIGGER insert_adminLogAFTER INSERTON adminFOR EACH ROW BEGININSERT INTO admin_log(id,account,oper_time)VALUES(new.id,new.account,NOW());END$$DELIMITER ;

– 插入管理员admin3

INSERT INTO admin(account,PASSWORD)VALUES('admin3','111');