目录
存储过程
存储过程是一个包括多条 SQL 语句的集合,专用于特定表的特定操作
函数与存储过程区别
函数是专用于进行数据处理,并将结果返回给调用者,它更多情况下是一条 SQL 语句的参与者,无法直接运行,并且不涉及某个特定表
存储过程是多条 SQL 语句的执行者,这是它们的本质区别
定义
定义存储过程与定义函数极为相似,它也可以包含参数,函数中使用的语句这里也能使用,但是它没有返回值
CREATE PROCEDURE test(`name` VARCHAR(20), pwd VARCHAR(20))
BEGIN
INSERT INTO users(username, `password`) VALUES(`name`, pwd);
END
可以在存储过程中编写多条 SQL 语句,但是注意,MySQL 的存储过程不具有原子性,当出现错误时,并不会回滚之前的操作,因此需要自己来编写事务保证原子性
执行存储过程
通过使用`call`来执行一个存储过程,如果存储过程有参数,那么还需要填写参数
CALL test('zzp', '123456')
使用游标来遍历一个SELECT语句查询的结果
游标的使用步骤
* DECLARE 游标名称 CURSOR FOR 查询结果 - 定义游标
* declare (continue/exit) handler for 异常名称(ID) 做点什么
* OPEN cur - 开启游标
* FETCH 游标名称 INTO 存储结果的变量 - 从顶部开始,每执行一次,向下移动,如果已经在最底部,则触发异常
* CLOSE cur - 关闭游标
BEGIN
DECLARE id INT;
DECLARE `name` VARCHAR(10);
DECLARE sex VARCHAR(5);
DECLARE score INT;
DECLARE a INT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT * FROM student;
-- 必须在游标定义之后编写
DECLARE CONTINUE HANDLER FOR 1329 SET a = 1;
OPEN cur;
WHILE a = 0 DO
FETCH cur INTO id, `name`, sex, score;
SELECT id, `name`, sex, score;
END WHILE;
CLOSE cur;
SELECT 1;
END
限定存储过程的参数传递
比如希望用户给一个参数用于接收数据,而不是值传递,可以将其设定为 OUT 类型
CREATE PROCEDURE `lbwnb`(OUT a INT)
BEGIN
SET a = 100;
END
所有的参数默认为`IN`类型,也就是只能作为传入参数,无法为其赋值,而这里把参数设定为`OUT`类型,那么参数无法将值传入,而只能被赋值。如果既希望参数可以传入也可以被重新赋值,可以将其修改为`INOUT`类型。
存储引擎
存储引擎就像我们电脑中的 CPU,整个 MySQL 最核心的部分,数据库中的数据如何存储,数据库能够支持哪些功能,我们的增删改查请求如何执行,都是由存储引擎来决定的
- MyISAM:MySQL5.5 之前的默认存储引擎,在插入和查询的情况下性能很高,但是它不支持事务,只能添加表级锁。
- InnoDB:MySQL5.5 之后的默认存储引擎,它支持 ACID 事务、行级锁、外键,但是性能比不过 MyISAM,更加消耗资源。
- Memory:数据都存放在内存中,数据库重启或发生崩溃,表中的数据都将消失。
查看 MySQL 支持的存储引擎
show engines;
在创建表时,也可以为表指定其存储引擎 ,还可以在配置文件中修改默认的存储引擎