MySQL 学习笔记(三)

2020-11-25  本文已影响0人  Whyn

索引

参考文章:MySQL - 索引

视图

视图是一个虚拟表,是从数据库中一个或多个表(或已存在的视图)中抽象而出的一个逻辑表。视图并不会存储真实数据,它包含的只是一个 SQL 查询,视图中的数据来源于其抽象的基本表,通过视图可以更加简单安全的操作基本表。

在关系型数据库中,每张表的结构都对应真实业务中的一个实体信息,因此,当一个大型实体信息内部依赖另一个实体信息时,在关系型数据中的表现就是两个具备关联关系的独立数据表,表的分离存储优点是数据更加内聚,存储空间小,但是增加了复杂性,比如要查看一个大型实体信息完整数据,则必须进行多表连接查询,而视图的出现,就可以消除这种复杂性,只需为这些关联表创建一个视图即可,该视图就可以表达所需的大型实体信息。

对视图的操作,主要有如下内容:

存储过程

存储过程是数据库用于封装一系列 SQL 语句集合的批处理程序单元,并且支持传入参数(入参),传出参数(出参),主要用来对一些具备重复性复杂操作进行封装,简化操作,并且存储过程创建后保存的是预编译结果,后续的调用过程无需再次编译,性能更加高效...

MySQL 中,存储过程程序主要包含『存储过程(Stored Procedure)』、『存储函数(Stored Function)』、『触发器(Trigger)』、『事件(Event)』和『视图(View)』,本章我们只关注存储过程和存储函数,其他存储过程程序详情可查看:Stored Objects

存储过程可以使用命令CREATE PROCEDURE进行创建,然后使用关键字CALL进行调用,存储函数可以通过命令CREATE FUNCTION进行创建,其可直接进行调用,就像调用 MySQL 内置函数。两者的区别是:存储函数内部必须包含有一个RETURN语句,并且该RETURN语句只能返回单个值或者表对象,而存储过程不允许执行RETURN,但是可以通过输出参数OUT返回多个值...

所有的存储过程和存储函数都存储在服务器上,客户端只需发送存储过程名称和相应参数就可以在服务器上进行调用,因此在大数据量情况下,存储过程能大幅提升效率。

对存储过程程序的操作,主要包含增删改查以及调用,具体如下:

下面介绍下存储过程和存储函数主体块(即routine_body中的BEGIN...END块)支持的一些高级语言语法特性:

综上:DECLARE...CONDITION语句其实就是命名(condition_name)了一个错误条件(错误条件其实就是一个错误码(condition_value)),通常我们还需要定义一个处理器Handler绑定这个错误条件,这样当系统产生这个错误条件时,处理器就能进行捕获并处理。

举个例子:创建一个存储过程,并为其添加'23000'错误捕获,输出信息提示:

mysql> CREATE TABLE tmp (
    -> id INT,
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (1.29 sec)

mysql> DELIMITER //
mysql> CREATE PROCEDURE handle23000()
    -> BEGIN
    -> # 创建错误捕获处理
    -> DECLARE EXIT HANDLER FOR SQLSTATE '23000' SELECT 'detected ERROR(23000)';
    -> SET @x = 1;
    -> INSERT INTO tmp VALUES(1);
    -> SET @x = 2;
    -> INSERT INTO tmp VALUES(1); # error occured
    -> SET @x = 3;
    -> END //
Query OK, 0 rows affected (0.35 sec)

mysql> DELIMITER ;
mysql> CALL handle23000();
+-----------------------+
| detected ERROR(23000) |
+-----------------------+
| detected ERROR(23000) |
+-----------------------+
1 row in set (0.15 sec)

Query OK, 0 rows affected (0.15 sec)

mysql> SELECT @x;
+------+
| @x   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

存储过程handle23000在第二次进行插入操作时,由于表tmp已存在相同主键,此时 MySQL 会抛出错误'23000',然后处理器就会捕获到该错误,从而执行SELECT 'detected ERROR(23000)'语句,又由于处理器我们设置了EXIT,即遇到错误代码后,就直接退出当前代码块(BEGIN...END),因此会话变量@x的值为2,而如果将EXIT改为CONTINUE,则遇到错误后,会继续执行后续代码,因此此时的@x = 3

:可以为错误码23000定义名称,更加语义化:

CREATE PROCEDURE handle23000()
BEGIN
DECLARE whyn_primary_key_already_exists CONDITION FOR SQLSTATE '23000';
DECLARE EXIT HANDLER FOR whyn_primary_key_already_exists SELECT 'detected ERROR(23000)';
...
END //

更多存储过程内容,可以参考:

触发器

触发器(trigger)是一个特殊的存储过程程序,它预先定义了六个事件,分别为BEFORE INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETE,当 MYSQL 对表执行INSERTUPDATEDELETE操作时,会自动触发相应触发器执行相应操作。
:存储过程需手动使用CALL进行调用,而触发器是监听某些事件自动被触发执行的。

对触发器的操作包含如下内容:

其他

MySQL 的内容很多,以下记录一些边角料内容:

附录

参考

上一篇 下一篇

猜你喜欢

热点阅读