作用:
在某张表发生INSERT、UPDATE、DELETE事件,触发程序逻辑,要是程序报错,可以定义数据的更改失败。
语法:
CREATE TRIGGER triggerName
BEFORE|AFTER INSERT|UPDATE|DELETE ON tableName
FOR EACH ROW
触发器执行的语句块;
说明:
触发器执行的语句块:可以是单条SQL语句,也可以是由BEGIN...END结构组成的复合语句块。
例子:
当创建的员工的工资大于其领导时,就报错(NEW表示插入的数据):
DELIMITER $
CREATE TRIGGER salary_check_trigger
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
#查询到要添加的数据的manager的薪资
DECLARE mgr_sal DOUBLE;
SELECT salary INTO mgr_sal FROM employees
WHERE employee_id = NEW.manager_id;
IF NEW.salary > mgr_sal
THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '错误,插入的薪资高于其领导';
END IF;
END $
查看数据库中定义的所有触发器:
- 命令行中建议用: SHOW TRIGGERS\G (能够有很好的格式化效果,图形化界面不能使用\G,只能用;结尾)
查看数据库中某个触发器的定义:
- SHOW CREATE TRIGGER 触发器名\G
删除触发器:
- DROP TRIGGER IF EXISTS 触发器名;
SHOW CREATE PROCEDURE | FUNCTION 存储过程或函数名\G (注意\G只在命令行能使用,一般使用;结束)
查看全局或者会话级别的系统变量
可以不写查询的系统变量的范围,默认是SESSION
SHOW GLOBAL | SESSION VARIABLES; 查看全局或者会话级别的所有系统变量
SHOW GLOBAL | SESSION VARIABLES LIKE 'admin_%'; 查询部分全局或者会话级别的系统变量
SELECT @@global.变量名; | @@session.变量名; | @@变量名;(优先从会话级别去找,不存在再去全局找); (注意:系统变量用@@变量名表示,用户自定义变量用@变量名)
设置系统变量
SET @@global.变量名 | GLOBAL | @@session.变量名 | SESSION 变量名 = 具体值
注意:
会话级别的系统变量更改,只在当前会话中有效,重新开启一个客户端登录,值就会恢复
全局级别的系统变量更改,只要重启就会恢复默认值,或者是配置文件my.ini中的值。
用户变量
分类:
会话用户变量:对当前连接有效
局部变量:只在BEGIN和END语句块中有效,局部变量只能在存储过程和函数中使用。
会话用户变量:
定义:
方式一:“=” | “:=”
- SET @变量名 = 值;
- SET @变量名 := 值;
方式二:“:=” | INTO关键字
- SELECT @变量名 := 表达式 [FROM 等子句];
- SELECT 表达式 INTO @变量名 [FROM 等子句];
例子:
- SELECT @count := count(*) FROM employees;
- SELECT AVG(salary) INTO @avg_sal FROM employees;
查看用户变量的值:
SELECT @变量名
局部变量:
定义:
使用DECLARE语句定义一个局部变量
作用域:
仅仅在定义它的BEGIN...END中有效
位置:
只能放在BEGIN...END中,而且只能放在第一句
例子:
BEGIN
#声明局部变量
DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];
DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
#为局部变量赋值
SET 变量名1 = 值;
SELECT 值 INTO 变量名2 [FROM 子句];
#查看局部变量的值
SELECT 变量1,变量2,变量3;
END
MYSQL知识触发器作用:在某张表发生INSERT、UPDATE、DELETE事件,触发程序逻辑,要是程序报错,可以定义数据的更改失败。语法:CREATE TRIGGER triggerNameBEFORE|AFTER INSERT|UPDATE|DELETE ON tableNameFOR EACH ROW触发器执行的语句块;说明:触发器执行的语句块:可以是单条SQL语句,也可以是由BEGIN...END结构组成的复合语句块。例子:当创建的员工的工资大于其领导时,就报错(NE