存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的 SQL 语句集。
创建存储过程之前我们必须修改 mysql 语句默认结束符 ; 使用delimiter 可以定义结束符
delimiter 新执行符号 可以是%或//
delimiter //
定义存储过程
语法:
create procedure 过程名(参数 1,参数 2....)
begin
sql 语句;
End
调用存储过程
call 过程名(参数 1,参数 2);
存储过程参数类型
mysql 定义变量
set @字段名=值
in 参数 传入参数
读取外部变量值,且有效范围仅限存储过程内部
Out 参数 传出参数
不读取外部变量值,在存储过程执行完毕后保留新值

不读取p_out的值,并且传出p_out的值
Inout 参数
读取外部变量,在存储过程执行完后保留新值
不加参数的情况
如果在创建存储过程时没有指定参数类型,则需要在调用的时候指定参数值
存储过程变量的使用
变量定义:declare variable_name [,variable_name...] datatype [DEFAULT value];
变量赋值: set 变量名 = 表达式值 [,variable_name = expression ...];
存储过程语句的注释
“--“:单行注释
“/*…..*/”:一般用于多行注释
存储过程流程控制语句
变量作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到 end 时。内部变量消失,此时已经在其作用域外,变量不再可见了。
但可用out参数传递出去。
两层嵌套
条件语句
if-then -else 语句

case 语句
循环语句
while · · · · end while
repeat· · · · end repeat
执行操作后检查结果,而 while 则是执行前进行检查
loop · · · · ·end loop
loop 循环不需要初始条件,这点和 while 循环相似,同时和 repeat 循环一样不需要结束条件,
leave 语句的意义是离开循环
查看存储过程
查看存储过程内容
show create procedure demo \G
查看存储过程状态
show procedure status \G 查看所有存储过程
修改存储过程
删了重建好了
删除存储过程
drop procedure 过程名
drop procedure if exists 过程名
不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
触发器
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行
创建触发器
create trigger 触发器名称 触发的时机 触发的动作 on 表名 for each row 触发器状态
触发的时机: before在执行动作之前 after 在执行动作之后
触发的动作:指的激发触发程序的语句类型<insert ,update,delete>
each row:操作每一行都监控
触发器创建语法四要素:
1. 监视地点(table)
2. 监视事件(insert/update/delete)
3. 触发时间(after/before)
4. 触发事件(insert/update/delete)
例:当 category 表中,删除一个 bTypeid=3 的图书分类时,books 表中也要删除对应分类的图书信息(类似级联删除)
查看触发器
查看创建过程
show create trigger delCategory\G
查看触发器详细信息
show triggers\G 这个查看所有的
删除触发器
drop trigger 触发器名称;
drop trigger delcategory//
事务
数据库事务:(database transaction): 事务是由一组 SQL 语句组成的逻辑处理单元.
使程序更可靠,简化错误恢复
A 汇款给 B 1000 元
A 账户-1000
B 账户+1000
以上操作对应数据库为两个 update。这两个操作组成一个事务单元。
一个事务单元中的操作全部成功,才成功,有一条失败,则整个事务失败。
否则,可能会出现 A 账户钱少了,B 账户钱没增加的情况。
事务四大特性
1. 原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,不允许事务部分执行。即使因为故障而使事务不能完成,在 rollback 时也要消除对数据库的影响!
2. 一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。在事务开始之前和结束之后,数据库的完整性约束没有被破坏。
3. 隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰,这些通过锁来实现。
4. 持久性(Durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障(比如说宕机等)不应该对其有任何影响。
MySQL 事务处理的方法
用 BEGIN,ROLLBACK,COMMIT 来实现
START TRANSACTION | BEGIN [WORK] 开启事务
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 提交当前事务,执行永久操作。
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 回滚当前事务到开始点,取消上一次开始点后的所有操作。
SAVEPOINT 名称 折返点
直接用 set 来改变 MySQL 的自动提交模式
MYSQL 默认是自动提交的,也就是你提交一个 QUERY,它就直接执行!
SET AUTOCOMMIT = {0 | 1} 设置事务是否自动提交,默认是自动提交的
0:禁止自动提交
1:开启自动提交
我们测试回滚操作,rollback
查看数据库引擎是否为innodb
为 MyISAM 无法成功启动事务,虽然提交了,却无法回滚
修改引擎为innodb
回滚失败,因为已经commit 提交了事务,对数据库的影响是永久性的。
set autocommit=0; 禁止自动提交
没有commit,回滚成功。