【MySQL笔记】MySQL之自定义函数和触发器的使用
创始人
2025-06-01 17:31:20
0

这篇文章,主要介绍MySQL中的自定义函数和触发器的使用。

目录

一、自定义函数

1.1、创建函数

1.2、案例代码

二、触发器

2.1、创建测试表

2.2、插入触发器

2.3、更新触发器

2.4、删除触发器

2.5、字段触发器


一、自定义函数

1.1、创建函数

MySQL中自定义函数使用【CREATE FUNCTION】来创建,具体的语法格式如下所示:

create function 函数名称(参数名称 参数类型,......)
returns 函数返回值数据类型
begin这里写具体的函数体内容return 返回值;
end

上面语法中,函数必须使用return返回一个值。

1.2、案例代码

-- 删除函数
drop function if exists demo_first_func;-- 创建函数
create function demo_first_func(name varchar(10), age int)
returns VARCHAR(100)
BEGINreturn concat('hello world, my name is ', name, ', age is ', age);
END-- 调用函数
select demo_first_func('Tom', 20);

运行结果如下:

二、触发器

MySQL中支持行级触发器,但是不支持某个字段的触发器,Oracle才支持某个字段的触发器。触发器有三种类型:

  • insert插入数据触发器:当表中新插入数据的时候,就会触发一个事件。
  • update更新数据触发器:当表中某条数据被更新的时候,就会触发一个事件。
  • delete删除数据触发器:当表中删除数据的时候,就会触发一个事件。

MySQL总共有6种触发器,分别是:插入之前触发、插入之后触发、更新之前触发、更新之后触发、删除之前触发、删除之后触发。触发器创建语法如下所示:

-- 创建触发器
create trigger 触发器名称
before/after  -- 触发器执行的时机,before表示之前执行,after表示之后执行
insert/update/delete on 表名称  -- 触发器类型,对某一张表进行哪种操作时候,会触发事件
for each row  -- 每一行数据设置触发器
BEGIN-- 具体触发器执行的代码
END

2.1、创建测试表

为了演示三种触发器的使用,这里创建两张数据表用于测试。

CREATE TABLE `t_test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `t_test02` (`id` int(11) NOT NULL,`name` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2、插入触发器

对于insert插入触发器来说,可以在触发器代码块中,使用【new】属性获取到新插入的数据记录,换句话说,【new】就表示新插入的那一条数据。

-- 删除触发器
drop trigger if exists insert_demo_trigger;-- 创建触发器
delimiter $
create trigger insert_demo_trigger
before  -- 触发器执行的时机,before表示之前执行,after表示之后执行
insert on t_test  -- 触发器类型,对某一张表进行哪种操作时候,会触发事件
for each row  -- 每一行数据设置触发器
BEGIN-- 具体触发器执行的代码-- 可以通过 【new】 属性获取到新插入的数据记录-- 将新插入的数据,修改之后,插入到 【t_test02】表中insert into t_test02 values( new.id + 1000, concat(new.name, '_bak'), new.age + 10);
END $
delimiter ;

下面向【t_test】表中插入一条数据,然后查看【t_test02】表中的记录。

-- 插入数据
insert into t_test values(1, '测试insert触发器', 20);

执行结果如下所示:

2.3、更新触发器

更新触发器可以通过【new】属性获取到更新之后的数据,通过【old】属性获取到更新之前的数据。

  • new属性:更新之后或者即将要更新的数据记录。
  • old属性:更新之前的数据记录。

为了测试方便,可以把前面创建的insert插入触发器先删除掉,在创建update更新触发器进行测试。

-- 删除触发器
drop trigger if exists update_demo_trigger;-- 创建触发器
delimiter $
create trigger update_demo_trigger
before  -- 触发器执行的时机,before表示之前执行,after表示之后执行
update on t_test  -- 触发器类型,对某一张表进行哪种操作时候,会触发事件
for each row  -- 每一行数据设置触发器
BEGIN-- 具体触发器执行的代码-- 可以通过 【new】 属性获取到即将要更新的数据记录-- 可以通过 【old】 属性获取到更新之前的数据记录-- 将新更新的数据、更新之前的数据,插入到 【t_test02】表中insert into t_test02 values( new.id + 2000, concat(new.name, '_new'), new.age + 20);insert into t_test02 values( old.id + 3000, concat(old.name, '_old'), old.age + 30);
END $
delimiter ;

更新数据记录,查看两个测试表的结果。

-- 更新数据
update t_test set name = '测试update触发器' where id = 1;

执行结果如下所示:

2.4、删除触发器

删除触发器可以通过【old】属性获取到删除之前的数据记录。

-- 删除触发器
drop trigger if exists delete_demo_trigger;-- 创建触发器
delimiter $
create trigger delete_demo_trigger
before  -- 触发器执行的时机,before表示之前执行,after表示之后执行
delete on t_test  -- 触发器类型,对某一张表进行哪种操作时候,会触发事件
for each row  -- 每一行数据设置触发器
BEGIN-- 具体触发器执行的代码-- 可以通过 【old】 属性获取到删除之前的数据记录-- 将删除的数据,插入到 【t_test02】表中insert into t_test02 values( old.id + 3000, concat(old.name, '_old'), old.age + 30);
END $
delimiter ;

执行一条删除语句,查看【t_test02】测试表中的数据。

-- 删除数据
delete from t_test where id = 1;

执行结果如下所示:

2.5、字段触发器

前面三种触发器都是针对每一行数据记录的,在实际的一些开发过程中,可能会存在某些需求是根据指定的字段来执行触发器,但是MySQL中并没有提供针对字段的触发器,Oracle中提供了字段触发器,可以对某个字段进行触发事件的监听。

虽然MySQL没有提供字段触发器,但是通过update更新触发器可以实现字段触发器的功能,基本思想就是:在update更新触发器中,通过【new】和【old】属性判断某个字段前后的数据是否一致,如果不一致,则表示这个字段发生了修改,那么此时就可以执行触发逻辑。

-- 删除触发器
drop trigger if exists update_field_demo_trigger;-- 创建触发器
delimiter $
create trigger update_field_demo_trigger
before  -- 触发器执行的时机,before表示之前执行,after表示之后执行
update on t_test  -- 触发器类型,对某一张表进行哪种操作时候,会触发事件
for each row  -- 每一行数据设置触发器
BEGIN-- 具体触发器执行的代码-- 可以通过 【old】和【new】 属性对比字段前后的值-- 将数据,插入到 【t_test02】表中if new.name <> old.name then-- name字段发生了改变,则执行触发逻辑insert into t_test02 values( new.id + 3000, concat(new.name, '_field'), new.age + 30);end if;
END $
delimiter ;

更新数据的name字段,查看测试表的记录变化。

-- 更新数据
update t_test set name = '测试update字段触发器' where id = 1;

执行结果如下:

到此,MySQL自定义函数和触发器就介绍完啦。

综上,这篇文章结束了,主要介绍MySQL中的自定义函数和触发器的使用。

相关内容

热门资讯

最新或2023(历届)十一国庆...   朋友不一定经常联系,但一定放在心里,时时会关心,刻刻会牵挂,分分会问候,秒秒会思念,只因“朋友”...
最新或2023(历届)最好的国...   明朗朗的国庆,乐呵呵的你,贴心的问候送给你;清爽爽的金秋,笑盈盈的你,美好的生活等着你;喜庆庆的...
最新或2023(历届)小学生国...   “千门万户瞳瞳日,总把旧桃换新符。”一元复始,万象更新。俗话说:年年岁岁花相似,岁岁年年人不同。...
最新或2023(历届)国庆节手...   小朋友们,国庆节假期七天长,应到户外去逛一逛;调整心态快乐无束,大自然中感受清风;吃吃美食来个几...
最新或2023(历届)国庆节手...   “出淤泥而不染,濯清涟而不妖”说的就是荷花~古人喜爱用荷花表达自己不受外界影响依然保持自己的君子...
最新或2023(历届)国庆节手...   在十月的桂花香中迎来了我们的十一国庆节~~我们都是爱祖国听妈妈话的好少年。让我们一起歌颂祖国:我...
最新或2023(历届)国庆节手...   在歌声中迎着朝阳成长“五星红旗迎风飘扬,胜利歌声多么响亮; 歌唱我们亲爱的祖国,从今走向繁荣富强...
最新或2023(历届)庆祝国庆...   也许我很渺小,所以写不出华丽的辞藻;也许我说的很少,但是我却在认真的思考。国庆节又来到,真心为你...
最新或2023(历届)关于国庆...   小朋友们,我愿我的祝福是小溪,悄悄地流淌在朋友的心上,绵绵不绝;我愿我的关怀是枫叶,轻轻地摇着秋...
最新或2023(历届)关于国庆...   小朋友们大家早上好啊,大家知道为什么要把十月一号定位国庆节呢,并不是中华人民共和国是在这一天建立...
最新或2023(历届)十一国庆...   大家早上好啊,也许在我们每个人的嘴上不是经常说着自己的祖国,可是我相信在我们的心中祖国永远都是很...
最新或2023(历届)最好的国...   每一阵清风细雨,都会让我将你轻轻想起;每一条祝福,都会将我们的心靠得更近;恰逢国庆之际,借此送上...
最新或2023(历届)关于国庆...   国庆节就是一个国家的节日。我们国家的国庆节是哪一天小朋友们知道吗?是农历的十月一日哦,大家会有很...
最新或2023(历届)最好的国...   小朋友们早上好啊,大家觉得在国庆的时候必不可少的是什么,当然是升国旗了,国庆节的时候都会在现在我...
最新或2023(历届)小学生国...   从1949年的中华人民共和国成立到现在,中华人民共和国已经走过了65年的风风雨雨,经过改革开放三...
最新或2023(历届)十一国庆...   国庆节是每个国家的重要节日,但是每个国家的叫法各有不同,有的国家叫国庆节或者是国庆日,还有一些国...
最新或2023(历届)关于国庆...   看到飞舞的五星红旗,大家知道五星红旗是谁设计的吗?是曾联松先生,他的设计稿从全国设计稿中脱颖而出...
最新或2023(历届)十一国庆...   大家早上啊,以前在国际上要是有人说自己是中国人,迎来的肯定是嘲讽和讽刺,但是现在你可以勇敢和骄傲...
关于五一放假的通知公告 杭州中... 劳作创造了前史,劳作创造了将来。下面小编为你精心收拾了几篇五一放假的告诉,期待阅览!  五一放假的告...
关于最新或2023(历届)五一... 五一劳作节即将来临,它是全国际劳作人民一起具有的节日,下面小编为你精心收拾了几篇五一放假的告诉,期待...