存储过程
简单来说就是为了以后的使用而保存的一条或多条MySQL语句的集合。
我觉得就是封装了一组sql语句
为什么需要存储过程(简单来说就是,简单、安全、高性能
CALL procedure_name(参数);
CREATE POCEDURE procedure_name()
BEGIN
SQL语句
END
MYSQL命令行客户机的分隔符
默认的MYSQL语句分割符为 ;
如果希望自定义分隔符,可以使用 DELIMITER
关键字
DELIMITER //
CREATE PROCEDURE procedure_name
BEGIN
SQL 语句
END //
DELIMITER ;
存储过程实际上是一种函数,所以存储过程名后边需要有 ()
存储过程在创建之后,被保存在服务器上以供使用,直到被删除
DROP PROCEDURE procedure_name;
注意,只需要给出存储过程名,不需要加 ()
变量
内存中的一个特定的位置,用来临时存储数据
参数的数据类型
存储过程的参数允许的数据类型与表中使用的数据类型相同
变量名
MYSQL中所有变量都必须以@
开始
为什么需要游标
MySQL检索操作,返回一组成为结果集的行,有时,需要在检索出来的行中前进或者后退几行,这就需要游标
游标的定义
游标是一个存储在MySQL服务器上的数据库查询,它是被语句查询出来的结果集
在存储了游标以后,应用程序可以根据需要滚动或浏览器中的数据
游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改
select
语句select
语句把数据实际检索出来CREATE PROCEDURE procedure_name
BEGIN
DECLARE vernier_name CURSOR
FOR
SELECT语句
END
OPEN vernier_name
CLOSE vernier_name
在一个游标关闭后,如果没有重新打开,则不能使用他
但是,声明过的游标,关闭后不需要再次声明
隐含关闭,如果你不明确关闭游标,MySQL会在 END
语句使,自动关闭游标
当一个游标被打开后,可以使用FETCH
来访问他的每一行
FETCH
指定检索什么数据,检索出来的数据存储在什么地方,还可以向前移动游标中的内部行指针,使下一条FETCH
语句检索下一行
DECLARE vernier_name CURSOR
FOR
SELECT语句
OPEN vernier_name
DECLARE O INT
REPEAT
FETCH vernier_name INTO O
UNTIL condition END REPEAT
CLOSE vernier_name
DECLARE
语句的次序
局部变量 > 游标 > 句柄
为什么需要触发器
有时需要,某个表发生改动时,自动处理,这种情况下,就需要触发器
MySQL中可以触发触发器的语句
DELETE\INSERT\UPDATE
触发器需要在每个表中唯一命名,但不需要在每个数据库中唯一,即数据库中的两个表可具有相同名字的触发器
CREATE TRIGGER trigger_name AFTER/BEFORE operation ON table_name
FOR EACH ROW
只有表才支持触发器,视图不支持
触发器按每个表每个事件每次定义,每个表每个事件每次只允许一个触发器
每个表最多支持6个触发器(3种操作 * ( before || after ) = 6
单一触发器不能与多个事件或多个表关联
触发器的类型
INSERT
触发器代码内,可以引用一个名为NEW
的虚拟表,访问被插入的行,before insert
触发器中, new
的值也可以被更新,auto_increment
列,new
在insert
执行前包含0,在INSERT
执行后包含新的自动生成值DELET
触发器代码内,可以引用一个名为OLD
的虚拟表,访问被删除的行OLD
中的值全部都是只读的,不能更新UPDATE
触发器代码中,可以引用OLD
虚拟表访问UPDATE
前的值,引用NEW
虚拟表,访问新更新的值BEFORE UPDATE
触发器中,NEW
中的值可能也被更新OLD
中的值全部都是只读的,不能更新COMMIT
&ROLLBACK
并非所有的引擎都支持事务处理,MyISAM
不支持事务处理,InnoDB
支持事务处理
事务处理
用于维护数据库的完整性,保证成批的MySQL操作要么完全执行,要么完全不执行
事务:指一组SQL语句
回退:被撤销指定SQL语句的过程
提交:将未存储的SQL语句结果写入数据库
保留点:事务处理中设置的临时占位符,可以对他发布回退
管理事务处理的关键在于,将SQL语句组分解为逻辑块,并明确规定数据和是应该回退,何时不应该回退
SELECT * FROM table_name;
START TRANSACTION;
DELETE FROM table_name;
SELECT * FROM table_name;
ROLLBACK;
SELECT * FROM order_name;
隐含提交:一般的MySQL语句都是直接针对数据库表执行和编写的,即提交操作是自动进行的
隐含事务关闭:当COOMIT
和ROLLBACK
语句执行后,是误会自动关闭
为了支持回退部分事务处理,可以在事务处理块中的合适位置防止占位符,如果需要回退,可以回退到某个占位符
保留点越多越好:可以在MySQL代码中设置任意多的保留点,保留点越多,你就越能按自己的意愿灵活的进行回退
释放保留点:保留点在事务处理完成后自动释放,也可以使用RELEASE SAVEPOINT
明确的释放保留点
SET autocommit=0;
autocommit
标志决定是否自动提交更改,不管有没有COMMIT
语句
autocommit
针对每个连接,而不是服务器