一、存储过程

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

SQL基础-存储过程&触发器的更多相关文章

  1. (2.11)Mysql之SQL基础——存储过程与变量

    (2.11)Mysql之SQL基础——存储过程 关键字:mysql存储过程 查看存储过程: []SELECT * FROM information_schema.ROUTINES WHERE ROUT ...

  2. pl/sql基础知识—触发器

    n  触发器简单介绍 触发器是指隐含执行的存储过程,它不是由程序员或者是DBA来显式调用,而是因为某个操作引发执行的.当定义触发器时,必须要指定触法的事件和触发的操作,常用的触发事件包括insert, ...

  3. ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)

    草图   真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...

  4. (2.12)Mysql之SQL基础——存储过程条件定义与错误处理

    转自:博客园桦仔 5.存储过程条件定义与错误处理 -- (1)定义 [1]条件定义:declare condition_name condition for condition_value;[2]错误 ...

  5. (2.13)Mysql之SQL基础——触发器

    (2.13)Mysql之SQL基础——触发器 关键词:Mysql触发器 1.一般形式 -- 0.查看触发器[1]SHOW TRIGGERS;[2]SELECT * FROM `information_ ...

  6. 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器

    @ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...

  7. T——SQL基础语句(定义变量,赋值,取值,分支,循环,存储过程)

    T--SQL基础语句 1.定义变量: declare @变量名 数据类型 ; declare @a int ; declare @b  nvarchar(10) ; 2.赋值: 法1:set @变量名 ...

  8. SQL基础随记2 视图 存储过程

    SQL基础随记2 视图 存储过程   View CREATE/ALTER/DROP VIEW ViewName as SELECT(...) 可以在视图的基础上继续创建视图,即,将之前创建的视图当做表 ...

  9. (2.15)Mysql之SQL基础——开发设计最佳规范

    (2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...

随机推荐

  1. Jmeter websocket插件安装与使用

    Jmeter websocket插件安装与使用 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试 ...

  2. tf.assign_add

    import tensorflow as tf global_step = tf.Variable(1.0, dtype=tf.float64, trainable=False, name='glob ...

  3. Java之路---Day13

    2019-10-28-22:40:14 目录 1.Instanceof关键字 2.Final关键字 2.1Final关键字修饰类 2.2Final关键字修饰成员方法 2.3Final关键字修饰局部变量 ...

  4. CentsOS原生RabbitMQ安装过程

    版本依赖问题 RabbitMQ安装时与Erlang的版本一定要保持以下的对应关系,否则会引发无法启动的问题 安装Erlang 下载Erlang依赖 1 wget http://erlang.org/d ...

  5. 购买了一台阿里云ECS后安装Java项目运行环境

    在docker等虚拟化技术大行其道的今天,我原本也想在我买的ECS服务器里全系使用docker技术,只可惜在我尝试后发现我的ECS配置不够高,整个服务器卡到爆炸,无奈只能使用最原始的方式. 我买的服务 ...

  6. 针对源代码和检查元素不一致的网页爬虫——利用Selenium、PhantomJS、bs4爬取12306的列车途径站信息

    整个程序的核心难点在于上次豆瓣爬虫针对的是静态网页,源代码和检查元素内容相同:而在12306的查找搜索过程中,其网页发生变化(出现了查找到的数据),这个过程是动态的,使得我们在审查元素中能一一对应看到 ...

  7. MySQL Config--参数innodb_flush_method

    延迟写 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输 ...

  8. Centos7永久修改IP地址(NAT模式)

    永久修改IP地址,即为设置静态的IP地址. 一.修改IP地址前需要准备的工作 1.虚拟机需要使用NAT的网络模式 虚拟机关机状态下,点击"编辑虚拟机设置",点击"网络适配 ...

  9. git远程上的分支到本地

    先想一个自己要在本地新建的分支名称,qianjinyan git checkout -b qianjinyan origin/SELLER-2248-1018 git branch 查看分支 git ...

  10. 逆向破解之160个CrackMe —— 019

    CrackMe —— 019 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...