触发器
在当前的表上,设置一个对每行数据的一个监听器,监听相关事件,每当事件触发时,就会执行一段由sql完成的一段功能代码触发事件:
insert, delete, update
new old : 针对的是触发的那张表 on 表名
insert : 没有 old 有new 【对于插入,插入之前什么都没有,插入之后才有数据】update : 有old 有new
delete : 有old 没有new
因为数据的改变不是固定,所以需要获取触发程序时的数据
old: 表示事件发生之前的数据, 旧的数据
new: 表示事件发生之后的数据, 新的数据
事件的时机: after(表示执行之后), before(表示执行之前);事件和时机组合在一起一共有六种事件
before insert, before delete, before update
after insert, after delete, after update监听的地点: table(表),事件规定在哪个表上的哪个时机的什么动作上
**************************************************************************************************
创建触发器
语法格式
create trigger trigger_name [六种情况] on table_name
for each row
begin
sql statement;
end;删除触发器
drop trigger trigger_name;
查看触发器
select trigger_name from `information_schema`.TRIGGERS;***************************************************************************************************
drop table if exists seller;
create table seller(
name varchar(30),
money double(8,2)
);
insert into seller values('狗娃', 5000);drop table if exists buyer;
create table buyer(
name varchar(30),
money double(8,2)
);
insert into buyer values('狗蛋', 1000);
例: 创建触发器
drop trigger if exists tr_buyer;
delimiter $$
create trigger tr_buyer after update on buyer
for each row
begin
update seller set money = money + 10;
end$$
delimiter ;
update buyer set money = money - 10;例: 查看触发器
select trigger_name from `information_schema`.TRIGGERS;例: 删除触发器
drop trigger [if exists] tr_buyer;**************************************************************************************************
例: 创建触发器
drop trigger if exists tr_buyer;
delimiter $$
create trigger tr_buyer after update on buyer
for each row
begin
# update seller set money = money + (买家原有的钱 - 买家现在的钱) '买家买东西的钱';
update seller set money = money + (old.money - new.money);
end$$
delimiter ;
update buyer set money = money - 1000;
例: drop trigger if exists tr_buyer;
delimiter $$
create trigger tr_buyer before update on buyer
for each row
begin
if new.money >= 0 then
update seller set money = money + (old.money - new.money);
else
SIGNAL SQLSTATE 'HY000' set MESSAGE_TEXT = '您的金钱不足';
end if;
end$$
delimiter ;update buyer set money = money - 2;
--如果事件是insert, 则只有new没有old
drop trigger if exists tr_buyer;
delimiter $$
create trigger tr_buyer before insert on buyer
for each row
begin
insert into seller values(old.name, old.money); #报错
end$$
delimiter ;
insert into buyer values('狗剩', 1000)
--如果事件是delete,则只有old没有new
drop trigger if exists tr_buyer;
delimiter $$
create trigger tr_buyer before delete on buyer
for each row
begin
insert into seller values(new.name, new.money); #报错
end$$
delimiter ;
delete from buyer where name = '狗蛋';ps: 触发器不能同名
现在mysql只支持一类事件设置一个触发器--充钱 取钱
create table yaoye(
id int primary key auto_increment,
name char(80),
age tinyint(4) unsigned
);create table fd(
fid int primary key,
fname char(80),
fage tinyint(4) unsigned
);针对一个帐号
存钱
取钱
当往yaoye 存钱的时候,要在fd显示出来
drop trigger if exists mtri;
delimiter $$ #更改默认的结束符号为 $$
create trigger mtri before update on yaoye for each row
begin
declare nowMoney float; # 申明一个变量nowMoney ,数据类型是float
select ymoney into nowMoney from yaoye where id = 1;
if(old.ymoney - new.ymoney < nowMoney)
then
update fd set fmoney = fmoney - ( old.ymoney - new.ymoney ) where fid = new.id; # new.ymoney 现在的钱 , old.ymoney 原先的钱
elseif(old.ymoney - new.ymoney > nowMoney)
then
set new.ymoney = old.ymoney; #
end if;
end $$
delimiter ;
if()
then ;
elseif
then
elseif
then ...;
else
sql代码
end if;*************************************************************************************************************
mysql函数
条件判断函数
1: if(expr, v1, v2): 如果expr这个条件成立,则执行v1,否则执行v2;
例: select if(1=0, 1, 0);
2: case when expr1 then v1
when expr2 then v2
else v3 end
例: select stu_no, stu_sex, case when stu_sex='男' then concat(stu_name,'大帅哥')
when stu_sex='女' then concat(stu_name,'小美女')
else stu_name end as '姓名'
from student;系统信息函数
1: select version(); 获取数据库系统版本号
2: select connection_id(); 获取数据库连接数
3: select database()/schema(); 获取当前数据库
4: select user(); 获取当前用户名加密函数
1: select password(str) 对str加密
2: select md5(str) 对str进行md5的加密其它
1: inet_aton(ip) 把ip转化为数值来表示
例: select inet_aton('192.16.70.100');
2: inet_ntoa(n) 把一个数值转化ip
例: select inet_ntoa(3222292068);自定义函数(函数不能返回结果集)
语法格式: create function 函数名(参数列表) returns 返回值类型
begin
函数体;
end;
例: 自定义一个返回矩形的面积的函数
delimiter $$
create function rectangle_area(w double, h double) returns double
begin
declare value double default 0;
set value := w*h;
return value;
end$$
delimiter ;
调用: select rectangle_area(3, 100);自定义函数: 因为官方函数是有限的,所以特殊的需求需要自己创造
语法【不带参数】:
drop function if exists 函数的名字;
delimiter $$
create function 函数的名字()returns 数据类型
begin
sql语句块
end $$
delimiter ;语法【带参数】:
drop function if exists 函数的名字;
delimiter $$
create function 函数的名字(参数名字1 数据类型1,参数名字2 数据类型2.....)returns 数据类型
begin
sql语句块
end $$
delimiter ;eg:
drop function if exists xiaokun;
delimiter $$
create function xiaokun()returns varchar(100)
begin
return "风度迷彩你好帅!!帅的我想揍你!!";
end $$
delimiter ;
怎么调用
select 函数名();monkey(num1,num2,opeart);
select monkey(23,45,"+");
select monkey(10,45,"*");
select monkey(16,8,"-");
select monkey(16,8,"/");
drop function if exists monkey;
delimiter $$
create function monkey(num1 float,num2 float,opeart varchar(100))returns float
begin
declare ope varchar(80); # 申明变量ope,数据类型是 varchar(80)
select trim(opeart) into ope; # 将opeart的值赋给 ope
if(ope != "")
then
if(ope = "+")
then return num1 + num2;
elseif(ope = "-")
then return num1 - num2;
elseif ope = "*"
then return num1 * num2;
elseif ope = "/"
then return num1 / num2;
end if;
else
return 0;
end if;
end $$
delimiter ;查看函数
select type, db, name from mysql.proc;
select type, db, name from mysql.proc where type = 'FUNCTION';
删除函数
drop function rectangle_area;
MySQL触发器使用详解(二)
最新推荐文章于 2024-06-14 08:00:00 发布