全局变量
当服务启动时,它将所有全局变量初始化为默认值。其作用域为 server 的整个生命周期。
可以使用
show global variables;
查看全局变量
可以使用下面这两种方式设置全局变量
set global sql_warnings=ON; -- global不能省略 /** 或者 **/ set @@global.sql_warnings=OFF;
查询全局变量时,可以使用
或者是
MySQL 流程语句介绍
MySQL 支持下面这些控制语句
- IF
IF 用于实现逻辑判断,满足不同条件执行不同的 SQL 语句
IF ... THEN ...
- CASE
CASE 实现比 IF 稍微复杂,语法如下
CASE ... WHEN ... THEN... ... END CASE
CASE 语句也可以使用 IF 来完成
- LOOP
LOOP 用于实现简单的循环
label:LOOP ... END LOOP label;
如果 ...
中不写 SQL 语句的话,那么就是一个简单的死循环语句
- LEAVE
用来表示从标注的流程构造中退出,通常和 BEGIN...END 或者循环一起使用
- ITERATE
ITERATE 语句必须用在循环中,作用是跳过当前循环的剩下的语句,直接进入下一轮循环。
- REPEAT
带有条件的循环控制语句,当满足条件的时候退出循环。
REPEAT ... UNTIL END REPEAT;
- WHILE
WHILE 语句表示的含义和 REPEAT 相差无几,WHILE 循环和 REPEAT 循环的区别在于:WHILE 是满足条件才执行循环,REPEAT 是满足条件退出循环;
触发器
MySQL 从 5.0 开始支持触发器
,触发器一般作用在表上,在满足定义条件时触发,并执行触发器中定义的语句集合,下面我们就来一起认识一下触发器。
举个例子来认识一下触发器:比如你有一个日志表和金额表,你每录入一笔金额就要进行日志表的记录,你会怎么样?同时在金额表和日志表插入数据吗?如果有了触发器,你可以直接在金额表录入数据,日志表会自动插入一条日志记录,当然,触发器不仅只有新增操作,还有更新和删除操作。
创建触发器
我们可以用如下的方式创建触发器
create trigger triggername triggertime triggerevent on tbname for each row triggerstmt
上面涉及到几个参数,我知道你有点懵逼,解释一下。
triggername
:这个指的就是触发器的名字triggertime
:这个指的就是触发器触发时机,是BEFORE
还是AFTER
triggerevent
: 这个指的就是触发器触发事件,一共有三种事件:「INSERT、UPDATE 或者 DELETE」。tbname
:这个参数指的是触发器创建的表名,在哪个表上创建triggerstmt
: 触发器的程序体,也就是 SQL 语句
所以,可以创建六种触发器
「BEFORE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE、BEFORE DELETE、AFTER DELETE」
上面的 for each now
表示任何一条记录上的操作都会触发触发器。
下面我们通过一个例子来演示一下触发器的操作
我们还是用上面的 procuct 表做例子,我们创建一个 product_info 产品信息表。
create table product_info(p_info varchar(20));
然后我们创建一个 trigger
我们在 product 表中插入一条数据
insert into product values(4,"pineapple",15.3);
我们进行 select 查询,可以看到现在 product 表中有四条数据
我们没有向 product_info 表中插入数据,现在我们来看一下 product_info 表中,我们预想到是有数据的,具体来看下
这条数据是什么时候插入的呢?我们在创建触发器 tg_pinfo
的时候插入了的这条数据。
删除触发器
触发器可以使用 drop
进行删除,具体删除语法如下
drop trigger tg_pinfo;
和删除表的语法是一样的
查看触发器
我们经常会查看触发器,可以通过执行 show triggers
命令查看触发器的状态、语法等信息。
另一种查询方式是查询表中的 information_schema.triggers
表,这个可以查询指定触发器的指定信息,操作起来方便很多
触发器的作用
- 在添加一条数据前,检查数据是否合理,例如检查邮件格式是否正确
- 删除数据后,相当于数据备份的作用
- 可以记录数据库的操作日志,也可以作为表的执行轨迹
❝注意:触发器的使用有两个限制
- 触发程序不能调用将数据返回客户端的存储程序。也不能使用 CALL 语句的动态 SQL 语句。
- 不能在触发器中开始和结束语句,例如 START TRANSACTION