MySQL存储函数
存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合.存储函数可以通过 return 语句返回函数值,主要用于计算并返回一个值.而存储过程没有直接返回值,主要用于执行操作.
在 MySQL 中,使用 CREATE FUNCTION 语句来创建存储函数,其语法形式如下:
RETURNS type
其中:
sp_name 参数:表示存储函数的名称;
func_parameter:表示存储函数的参数列表;
RETURNS type:指定返回值的类型;
characteristic 参数:指定存储函数的特性,该参数的取值与存储过程是一样的;
func_parameter 可以由多个参数组成,其中每个参数由参数名称和参数类型组成,其形式如下: [IN | OUT | INOUT] param_name type;
IN 表示输入参数,OUT 表示输出参数,INOUT 表示既可以输入也可以输出;
param_name 参数是存储函数的参数名称;
type 参数指定存储函数的参数类型,该类型可以是 MySQL 数据库的任意数据类型.
例如:使用 CREATE FUNCTION 创建查询 tb_student 表中某个学生姓名的函数,SQL 语句和执行过程如下:
USE test;
Database changed
DELIMITER //
CREATE FUNCTION func_student(id INT(11))
BEGIN
RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);
END//
Query OK,0 rows affected (0.10 sec)
DELIMITER ;
平台会对你编写的代码进行测试:
测试输入:无; 预期输出:
①.100
use demo;
#代码开始
#定义、调用参数函数(func\_sqty):查询返回指定供应商的供应零件总数量.
DELIMITER $$
CREATEFUNCTION func\_sqty(p\_sno CHAR(2))
RETURNS INT
BEGIN
RETURN v\_sqty;
END$$
DELIMITER ;
#代码结束
select func\_sqty('S1');
select func\_sqty('S2');
select func\_sqty('S3');
触发器(trigger)是与表/库上的操作事件相关的一类特殊的存储过程,它在相关事件发生时被触发执行,常用于实现数据的完整性约束和业务规则.
MySQL 的触发器和存储过程一样,都是嵌入到 MySQL 中的一段程序,是 MySQL 中管理数据的有力工具.不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工启动,而是通过对数据表的相关操作来触发、激活从而实现执行.比如当对 student 表进行操作(INSERT,DELETE 或 UPDATE)时就会激活它执行.
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性约束,它能够对数据库中的表做级联修改,提供比CHECK约束更复杂的的数据完整性约束,并自定义错误消息.触发器的主要作用有以下几个方面:
强制数据库间的引用完整性
级联修改数据库中所有相关的表,自动触发其它与之相关的操作
跟踪变化,撤销或回滚违法操作,防止非法修改数据
返回自定义的错误消息,约束无法返回信息,而触发器可以
触发器可以调用更多的存储过程
语法格式如下:
CREATE
ON FOR EACH Row
DELIMITER $
MySQL删除触发器可以使用drop trigger删除触发器: drop trigger trigger_name;
删除前先判断触发器是否存在: drop trigger if exists trigger_name
另外,在 MySQL 中,若需要查看数据库中已有的触发器,则可以使用 SHOW TRIGGERS 语句. 语法格式如下: SHOW TRIGGERS;
drop table if exists tmp1;
drop trigger if exists tmp1_insert;
create trigger tmp1_insert
before insert on tmp1
for each row
begin
end;
测试触发更新效果:
Query OK,1 row affected (0.01 sec)
Query OK,1 row affected (0.00 sec)
select*from tmp1;
drop trigger if exists tmp1_update;
create trigger tmp1_update
after update on tmp1
| id | name |
|1|爱E族|
①. row inset(0.00 sec)
| fid | name |
Rows matched:1Changed:1Warnings:0
|1| aiezu.com |
原始表结构及数据如下所示:
预期输出:
TRIGGER_NAME ACTION_TIMING EVENT_MANIPULATION EVENT_OBJECT_TABLE
tr_spj_insert AFTER INSERT spj
sno sname status city sqty
use demo;
#定义一个触发器(tr\_spj\_insert),完成向SPJ表新增数据时,及时更新所有供应商供应零件总数量.
#代码开始
DELIMITER $$
CREATETRIGGER tr\_spj\_insert AFTER INSERTON spj
FOREACHROW
BEGIN
UPDATE s SET sqty =(SELECTSUM(qty)FROM spj WHERE sno = NEW.sno)WHERE sno = NEW.sno;
END$$
DELIMITER ;
#代码结束
#以下代码不要改动或删除,将会对创建的触发器进行测试
insertinto spj values
('S1','P1','J1',200),
('S1','P1','J3',100),
('S1','P1','J4',700),
('S1','P2','J2',100),
('S2','P3','J1',400),
('S2','P3','J2',200),
('S2','P3','J4',500),
('S2','P3','J5',400),
('S2','P5','J1',400),
('S2','P5','J2',100),
('S3','P1','J1',200),
('S3','P3','J1',200),
('S4','P5','J1',100),
('S4','P6','J3',300),
('S4','P6','J4',200),
('S5','P2','J4',100),
('S5','P3','J1',200),
('S5','P6','J2',200),
('S5','P6','J4',500);
tr_spj_delete AFTER DELETE spj
use demo;
#定义一个触发器(tr\_spj\_delete),完成向SPJ表删除数据时,及时更新所有供应商供应零件总数量.
#代码开始
DELIMITER $$
CREATETRIGGER tr\_spj\_delete AFTER DELETEON spj FOREACHROW
BEGIN
GROUPBY sno
)AS t ON s.sno = t.sno
SET s.sqty = t.total\_qty;
#代码结束
#以下代码不要改动或删除,将会对创建的触发器进行测试
DELETEFROM spj WHERE sno='S1'AND pno='P1'AND jno='J1';
tr_spj_update AFTER UPDATE spj
use demo;
#定义一个触发器(tr\_spj\_update),完成向SPJ表更新数据时,及时更新所有供应商供应零件总数量.
#代码开始
DELIMITER $$
CREATETRIGGER tr\_spj\_update AFTER UPDATEON spj FOREACHROW
BEGIN
IF OLD.sno \<\> NEW.sno THEN
ELSEIF OLD.qty \<\> NEW.qty THEN
GROUPBY sno
)AS t ON s.sno = t.sno
SET s.sqty = t.total\_qty;
#代码结束
#以下代码不要改动或删除,将会对创建的触发器进行测试
UPDATE spj SET sno='S1'WHERE sno='S2'AND pno='P3'AND jno='J1';
以上就是土嘎嘎小编为大家整理的实验七 函数与触发器相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!