一、存储过程

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语言的功能和灵活性; 缺点:
 开发调试困难;
 可移植性差;

最新文章

  1. poj1273 Drainage Ditches
  2. centos6.4 搭建svn服务器
  3. ELK日志管理之——elasticsearch部署
  4. Mysql ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
  5. CodeForces 362B Petya and Staircases
  6. [TPYBoard-Micropython教程之1] 运行第一个脚本——点亮LED
  7. redis bitcount variable-precision swar算法
  8. [Apio2012]dispatching
  9. cygwin vi编辑器左右上下键和删除键乱码错误
  10. “==”和equals
  11. Learning-Python【4】:Python流程控制与循环
  12. OpenStack keystone节点搭建(官方2018年4月份文档)
  13. producter-consumer 他山之石
  14. NN中BP推导及w不能初始化为0
  15. [Scikit-learn] 1.1 Generalized Linear Models - Lasso Regression
  16. passport登录问题:passport.use 方法没有被调用
  17. Linux基础操作-分区概念
  18. 论文笔记——N2N Learning: Network to Network Compression via Policy Gradient Reinforcement Learning
  19. vue项目中使用mockjs模拟接口返回数据
  20. js 匹配中文字符串(也包含日文和韩文)

热门文章

  1. Excel转换成xml文件
  2. java之maven之初识maven
  3. 不用Pageant告别Pageant Windows10下TortoiseGit和Git配置使用同一SSH密钥
  4. Matlab命令模式
  5. WinExec, ShellExecute,CreateProcess 区别
  6. httpPost请求用java代码实现的方法
  7. CentOS7 安装 浏览器
  8. RabbitMQ基本概念(一)-RabbitMQ的优劣势及产生背景
  9. ExtendEvent-判断DB是否有在使用
  10. uboot是什么