系统变量

是 MySQL 服务器有的变量,用于支持服务的运转。

变量级别

全局系统变量:MySQL 应用级别,所有的会话均可访问。

会话系统变量:单次的会话级别,不同会话之间隔离。

在 MySQL 中有些系统变量只能是全局的,例如 max_connections 用于限制服务器的最大连接数;有些系统变量作用域既可以是全局又可以是会话,例如 character_set_client 用于设置客户端的字符集(可以作为全局变量设置为默认值,也可以变成会话变量只设置当前会话的字符集);有些系统变量的作用域只能是当前会话,例如 pseudo_thread_id 用于标记当前会话的 MySQL 连接 ID。

查看变量

1
2
3
4
5
#查看满足条件的部分系统变量。
SHOW GLOBAL VARIABLES LIKE '%标识符%';

#查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%标识符%';

作为 MySQL 编码规范,MySQL 中的系统变量以两个“@”开头,其中“@@global”仅用于标记全局系统变量,“@@session”仅用于标记会话系统变量。“@@”首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量。

1
2
3
4
5
6
7
#查看指定的系统变量的值
SELECT @@global.变量名;

#查看指定的会话变量的值
SELECT @@session.变量名;
#或者
SELECT @@变量名;

修改变量

有些时候,数据库管理员需要修改系统变量的默认值,以便修改当前会话或者 MySQL 服务实例的属性、特征。具体方法:

方式1:修改 MySQL 配置文件,继而修改 MySQL 系统变量的值(该方法需要重启 MySQL 服务)

方式2:在 MySQL 服务运行期间,使用“set”命令重新设置系统变量的值

1
2
3
4
5
6
7
8
9
10
11
12
#为某个系统变量赋值
#方式1
SET @@global.变量名=变量值;
#方式2
SET GLOBAL 变量名=变量值;


#为某个会话变量赋值
#方式1
SET @@session.变量名=变量值;
#方式2
SET SESSION 变量名=变量值;

用户变量

用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用范围不同,又分为 会话用户变量局部变量

  • 会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效。

  • 局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在 存储过程和函数 中使用。

定义变量

会话变量:

1
2
3
SET @用户变量 = 值;

SELECT 表达式 INTO @用户变量 [FROM 等子句];

局部变量:

1
2
3
DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];

SELECT 字段名或表达式 INTO 变量名 FROM 表;

对比

1
2
3
                    作用域					定义位置                    语法
会话用户变量 当前会话 会话的任何地方 加@符号,不用指定类型
局部变量 定义它的 BEGIN ENDBEGIN END 的第一句话 一般不用加@,需要指定类型

配置文件

win 下面的配置文件是 ini,而 Linux/MacOS 是 cnf。启动 MySQL 的时候,会读取对应的配置信息。

基本格式

与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号 [] 扩起来,像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[server]
(具体的启动选项...)

[mysqld]
(具体的启动选项...)

[mysqld_safe]
(具体的启动选项...)

[client]
(具体的启动选项...)

[mysql]
(具体的启动选项...)

[mysqladmin]
(具体的启动选项...)

像这个配置文件里就定义了许多个组,组名分别是server 、mysqld、mysqld_safe、 client、mysql、mysqladmin。每个组下边可以定义若干个启动选项,使用 key=value 的形式。

  • 如果两个一模一样的配置冲突,则按照最后的那个生效。

选项组

配置文件中不同的选项组是给不同的启动命令使用的。不过有两个选项组比较特别:

  • [server] 组下边的启动选项将作用于所有的服务器程序。
  • [client] 组下边的启动选项将作用于所有的客户端程序。

下面是启动命令能读取的选项组都有哪些:

启动命令 类别 能读取的组
mysqld 启动服务器 [mysqld]、[server]
mysqld_safe 启动服务器 [mysqld]、 [server] 、[mysqld_safe]
mysql.server 启动服务器 [mysqld]、[server]、[mysql.server]
mysql 启动客户端 [mysql]、[client]
mysqladmin 启动客户端 [mysqladmin]、[client]
mysqldump 启动客户端 [mysqldump] 、[client]

触发器

触发器是由 事件来触发 某个操作,这些事件包括 INSERTUPDATEDELETE 事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会 自动 激发触发器执行相应的操作。

创建

1
2
3
4
CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW -- 这句话是固定的,要判断行数据处理的话在执行语句块里进行
触发器执行的语句块;
  • 表名:表示触发器监控的对象。

  • BEFORE|AFTER:表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。

  • INSERT|UPDATE|DELETE:表示触发的事件。

    • INSERT 表示插入记录时触发;
    • UPDATE 表示更新记录时触发;
    • DELETE 表示删除记录时触发。
  • 触发器执行的语句块:可以是单条SQL语句,也可以是由BEGIN…END结构组成的复合语句块。


比如,用触发器更新日志:

1
2
3
4
5
6
7
8
9
10
11
DELIMITER //

CREATE TRIGGER after_insert
AFTER INSERT ON test_trigger
FOR EACH ROW
BEGIN
INSERT INTO test_trigger_log (t_log)
VALUES('after_insert');
END //

DELIMITER ;

查看

查看触发器是查看数据库中已经存在的触发器的定义、状态和语法信息等。

方式1:查看当前数据库的所有触发器的定义

1
SHOW TRIGGERS\G

方式2:查看当前数据库中某个触发器的定义

1
SHOW CREATE TRIGGER 触发器名

方式3:从系统库 information_schema 的 TRIGGERS 表中查询 “salary_check_trigger” 触发器的信息。

1
SELECT * FROM information_schema.TRIGGERS;

删除

触发器也是数据库对象,删除触发器也用 DROP 语句,语法格式如下:

1
DROP TRIGGER IF EXISTS 触发器名称;