定义: 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt;
-------------------------------
说明:
trigger_time:触发程序的动作时间。它可以是BEFORE或AFTER,
以指明触发程序是在激活它的语句之前或之后触发
trigger_event:写操作
INSERT:将新行插入表时激活触发程序
UPDATE:更改某一行时激活触发程序
DELETE:从表中删除某一行时激活触发程序
trigger_stmt:可以使用别名OLD和NEW,引用与触发程序相关的表中的列:
OLD.col_name在更新或删除它之前,引用已有行中的1列
NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列
案例:订单和库存
CREATE TRIGGER ord_sub after insert on orders FOR EACH ROW
update products set pstock=pstock-new.count where pid=new.pid;
查看触发器:
SHOW TRIGGERS;
删除触发器:
DROP TRIGGER trigger_name;
二、mysql中的事务
事务的四个特性:
原子性
该事务中的所有操作,是一个整体,不可分割;要么都执行,要么都不执行。
一致性
执行前的数据与执行后的数据结果统一保持一致。要么都成功,要么都失败。
隔离性
事务与事务之间的可见性: 1、未提交读 -- uncommit read 2、提交读 -- commit read 3、可重复读 4、串行化
持久性
用法: 前提:当前表的存储引擎必须支持事务。
步骤: 1、开启事务: start transaction 2、操作(insert,delete,update) 3、提交事务(commit)/回滚事务(rollback)
查看当前数据库中支持的存储引擎:
show engines;
三、sql编程
1、mysql中的变量
变量分为两类:
自定义变量:
局部变量: declare 变量名 类型(长度)
用户变量: @变量名
系统变量:
会话变量:@@session.变量名
全局变量:@@global.变量名
2、mysql中的存储过程和函数
存储过程
没有返回值的函数保存在数据库中-----存储过程。
基本语法:
#创建存储过程-----------------------------------------------
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
BEGIN
逻辑代码(sql语句)
END
说明:
sp_name: 过程名
proc_parameter: 参数
[IN|OUT|INOUT] 参数名 类型(长度);
--如果在过程或函数中需要执行多条sql语句,则提前需要将mysql
--语句的结束符修改防止冲突: delimiter //
#调用存储过程:----------------------------------------------
call 过程名称(参数列表)
案例1:计算两个数的和
delimiter //
create procedure test_pro(in n1 int(5),in n2 int(5))
-> begin
-> select n1+n2;
-> end//
delimiter ;
案例2:求和并设置输出类型参数
create procedure test_pro_out(in n1 int(5),in n2 int(5),out sum int(5))
begin
set sum := n1+n2;
end//
查询存储过程:
show procedure status like '%num%';
删除存储过程:
drop procedure 过程名称
函数
语法:
CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body 说明: func_parameter: 函数参数(参数名 类型(长度)) RETURNS: 表示函数的返回值类型
查看函数:
show function status like '%fun%';
删除函数:
DROP FUNCTION func_name;
函数调用:
函数名称(参数列表);
3、IF语句
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF
4、WHILE循环
[begin_label:] WHILE search_condition DO statement_list END WHILE [end_label]
案例:
create procedure num_sum() begin declare n int(10); declare sum int(10); set sum:=0; set n:=10; while n>=1 do set sum = sum+n; set n = n-1; end while; select sum; end//
mysql中的游标:
CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT 0; DECLARE a CHAR(16); DECLARE b,c INT; #创建游标 DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; #declare处理程序(出现02000状态值,执行CONTINUE,并且设置done的值为1) DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; #打开游标 OPEN cur1; OPEN cur2; #循环遍历 REPEAT #从游标中提取数据到变量(声明游标的sql字段与此处的变量一一对应) FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; #直到done为true时,结束REPEAT遍历 UNTIL done END REPEAT; #关闭游标 CLOSE cur1; CLOSE cur2; END
5、mysql中的预处理
当我们在编写存储过程或函数时,如果需要根据参数实现动态拼接sql语句并执行,则可以利用prepare这种方式实现,其基本语法如下:
#准备预处理sql
PREPARE stmt_name FROM '自定义sql';
#执行预处理语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
#释放连接
{DEALLOCATE | DROP} PREPARE stmt_name;