SQL基础-存储过程&触发器
2024-09-07 22:39:09
一、存储过程
1、存储过程简介
存储过程:
一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,然后通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 存储过程的创建:
使用关键字CREATE PROCEDURE
2、存储过程的创建及调用
比如:
现需要向学生表中插入新的学生数据。但在插入学生数据的时,需要同时检查老师表里的数据。
如果插入学生的老师不在老师表里,则先向老师表中插入一条老师数据,再向学生表中插入学生数据。 步骤:
1、使用SELECT语句查询新学生的老师是否存在于老师表中;
如果不存在 ,则继续执行第2步;
如果存在,则直接跳到第3步;
2、向老师表中插入老师数据;
3、向学生表中插入学生数据; ##
存储过程的创建: CREATE PROCEDURE sp_add_student(
IN i_student_id VARCHAR(50), IN i_student_name VARCHAR(100),
IN i_gender VARCHAR(10), IN i_birth_day DATE,
IN i_age INT, IN i_class_id VARCHAR(50),
IN i_score DECIMAL(18,2), IN i_teacher_id VARCHAR(20)
)
BEGIN
IF NOT EXISTS(SELECT 1 FROM teacher WHERE teacher_id = i_teacher_id) THEN
INSERT INTO teacher(teacher_id) VALUES (i_teacher_id);
END IF;
INSERT INTO student VALUES(
i_student_id,i_student_name,i_gender,i_birth_day,
i_age, i_class_id, i_score, i_teacher_id
);
END; ##
存储过程的调用:使用关键字CALL CALL sp_add_student(
'S20170091', '杨艳', '女', '2003-04-09',
15, 'G0206', 89.23, 'T0021'
);
3、存储过程的删除
存储过程的删除:
使用关键字DROP PROCEDURE 如:DROP PROCEDURE sp_add_student;
4、存储过程的优缺点
优点:
功能强大、灵活性高;
模块化,封装,代码复用; 缺点:
开发调试困难;
可移植性差,不同数据库,语法差别很大,移植困难;
二、触发器
1、触发器简介
触发器:
一种与表操作有关的数据库对象,当触发器所在表上出现指定事件(新增、修改、删除数据)时,将调用该对象,即表的操作事件触发表上的触发器的执行。 如上面的存储过程中:
写出了存储过程,并调用: CALL sp_add_student(
'S20170091', '杨艳', '女', '2003-04-09',
15, 'G0206', 89.23, 'T0021’
); 如果有多个学生的数据需要插入,则需要多次调用该存储过程; 可否不开发存储过程,在向student表插入(INSERT)数据前,后台自动判断并插入老师数据? ---触发器
2、触发器的创建及调用
触发器的创建:使用关键字CREATE TRIGGER 比如:
现需要向学生表中插入新的学生数据。但在插入学生数据的时,需要同时检查老师表里的数据。如果插入学生的老师不在老师表里,
则先向老师表中插入一条老师数据,再向学生表中插入学生数据。 创建一个BEFORE INSERT触发器:
CREATE TRIGGER tri_add_student BEFORE INSERT
ON student FOR EACH ROW
BEGIN
IF NOT EXISTS(SELECT 1 FROM teacher WHERE teacher_id =
new.teacher_id) THEN
INSERT INTO teacher(teacher_id) VALUES (new.teacher_id);
END IF;
END; 执行insert语句:
INSERT INTO student VALUES(
'S20170092', '李文', '女', '2002-11-19',
16, 'G0206', 55.32, 'T0022'
); BEFORE INSERT触发器:
在执行insert语句之前,会先自动执行触发器;
3、触发器的分类及执行顺序
按事件类型分:
INSERT触发器;
UPDATE触发器;
DELETE触发器; 按执行先后分:
BEFORE触发器;
AFTER触发器; NEW与OLD:
INSERT触发器:NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据; UPDATE触发器:OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据; DELETE触发器:OLD 用来表示将要或已经被删除的原数据; 触发器执行时的异常情况:
如果 BEFORE 触发器执行失败,SQL 无法正确执行; SQL 执行失败时,AFTER 型触发器不会触发; AFTER 类型的触发器执行失败,SQL 会回滚;
4、触发器的删除
触发器的删除:
使用关键字DROP TRIGGER 如:DROP TRIGGER tri_add_student;
5、触发器的优缺点
优点:
自动触发,无需调用;
提供了一种检查、保证数据完整性的方法;
与存储过程一样,增强SQL语言的功能和灵活性; 缺点:
开发调试困难;
可移植性差;
最新文章
- poj1273 Drainage Ditches
- centos6.4 搭建svn服务器
- ELK日志管理之——elasticsearch部署
- Mysql ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
- CodeForces 362B 	Petya and Staircases
- [TPYBoard-Micropython教程之1] 运行第一个脚本——点亮LED
- redis bitcount variable-precision swar算法
- [Apio2012]dispatching
- cygwin vi编辑器左右上下键和删除键乱码错误
- “==”和equals
- Learning-Python【4】:Python流程控制与循环
- OpenStack keystone节点搭建(官方2018年4月份文档)
- producter-consumer 他山之石
- NN中BP推导及w不能初始化为0
- [Scikit-learn] 1.1 Generalized Linear Models - Lasso Regression
- passport登录问题:passport.use 方法没有被调用
- Linux基础操作-分区概念
- 论文笔记——N2N Learning: Network to Network Compression via Policy Gradient Reinforcement Learning
- vue项目中使用mockjs模拟接口返回数据
- js 匹配中文字符串(也包含日文和韩文)