MySQL——自定义[存储]函数、触发器
一. 编程基础
1) 结束符
2) 代码块
Begin 相当于 {
end; 相当于 }
1. 变量
系统变量
Show variables;
查看系统变量sql_mode
1 会话变量 2 Set @变量名=值;
局部变量 // 在函数或过程内部定义的变量
1 Declare 变量名 类型 default 默认值; 2 3 Declare I int default 0;
2. 循环while
1 变量初始化; 2 3 [名称]:While 条件判断 do 4 5 循环体; 6 7 增量; 8 9 End 空格 while;
delimiter // create function mywhile(n int) returns int begin declare i int default 0; declare sum int default 0; while i <= n do set sum = sum + i; set i = i +1; end while; return sum; end; // delimiter ;
调用函数:
1 select mywhile(100);
3. 判断if
If 条件 then return 返回值; Elseif 条件 then return 返回值; Else return 返回值; End if;
delimiter // create function checkuser(name varchar(11)) returns varchar(11) begin if name = 'admin' then return "ok"; else return "no"; end if; end; // delimiter ;
二.自定义[存储]函数
1) 创建自定义函数
Create Function 名称(参数 数据类型) returns 数据类型 说明: create function 关键字 名称 //自定义函数名称,用来调用. ([参数 数据类型]) //形参为可选 Returns 数据类型 //指明返回值的类型, 注意:returns 注意:自定义函数体中必须有返回值 使用关键字return 没有参数的:
delimiter // create function test() returns varchar(11) begin return 'ok'; end; // delimiter ;
2) 调用函数
Select 函数名称([参数]);
说明: select 函数名称([参数]) // 根据定义函数时形参. ,形参与实参保持一致.
3) 查看创建函数信息
show create function 函数名称 \G
4) 查看所有自定义函数
1 show function status \G
5) 删除自定义函数
1 Drop function 函数名称;
如果当前数据库不是db_five
Drop function db_five.mywhile;
自定义函数中可以执行的SQL语句: delete, update,insert
三.存储过程
概念: 存储过程就是一条或多条SQL语句的集合.即没有返回值的存储函数
delimiter // create procedure myselect() begin select * from student; end; // delimiter ;
1. 定义存储过程
Create procedure 过程名称(in 参数 类型,out 参数 类型 inout 参数 类型)
说明:
1) Create procedure // 创建过程关键字
2) In 参数 数据类型 (默认) //类似于php中的拷贝传值
3) Out 参数 数据类型 //类似于php中的引用传值, 传递到过程中将这个变量赋值为NULL;
4) Inout 参数 数据类型 //类似于php中的引用传值;
delimiter // create procedure mytest(in a int, out b int,inout c int) begin select a,b,c; set a=11,b=22,c=33; select a,b,c; end; // delimiter ;
2. 调用存储过程
Call 过程名称( [参数])
3. 查看创建存储过程信息
Show create procedure 过程名称
4. 查看所有存储过程
Show procedure status \G
5. 删除存储过程
Drop procedure 过程名称
四.触发器
概念: 触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE和DELETE语句。当执行这些事件时,就会激活触发器执行相应的操作。
1. 创建触发器
create trigger 名称 after|before 事件 insert|update|delete on 表名 for each row
说明:
1) Create trigger //创建触发器的关键字
2) 名称
3) After|before , 触发时机
4) insert|update|delete //事件
5) on 表名 //作用于哪张表
6) for each row //触发器是基于行.
nowtime //id,nowtime; nowuser //id,name 在用户表中添加用户时,通过触发器会自动在nowtime表中将当前的时间添加 delimiter // create trigger tg1 after insert on nowuser for each row begin insert into nowtime values (null,now()); end; // delimiter ;
2. 两个关键字: new, old
在触发器中,当触发事件发生时,
new : 代表新行, old: 代表旧行
insert 操作: 成功之后,其后会自动产生一行新的数据. 在触发器中通过new获取新行字段值
delete 操作, 其成功之后, 对旧行数据进行删除,在触发器中可以通过old获取旧行字段值
update操作: 其会对原有的旧行,更新为新行. 既有新行又有旧行
insert 事件
delimiter // create trigger tg1 after insert on tb_order for each row begin update tb_goods set inv = inv - new.num where id = new.pid; end; // delimiter ;
Delete 事件:
-- delete delimiter // create trigger tg2 after delete on tb_order for each row BEGIN update tb_goods set inv = inv + old.num where id = old.pid; end; // delimiter ;
Update 事件:
New,old
delimiter // create trigger tg3 after update on tb_order for each row begin update tb_goods set inv = inv + old.num - new.num where id = old.pid; end; // delimiter ;
3. 显示所有触发器
Show triggers \G
4. 删除触发器
Drop trigger 触发器名称