MySQL存储对象

这篇博客详细介绍了MySQL的存储对象,包括存储过程与存储函数、触发器、事件和视图。在存储过程和存储函数中,讲解了如何创建这两个概念;触发器部分提到了OLD和NEW关键字的作用以及触发器的限制;事件部分阐述了MySQL事件调度程序的功能以及如何启用和创建事件;最后,简要介绍了视图的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL存储对象

存储过程包含存储过程与存储函数

存储程序包含存储过程、触发器和事件

存储对象包含存储程序和视图

1、存储过程与存储函数
1、创建存储过程
delimiter //      #定义分隔符
CREATE PROCEDURE dorepeat1(p1 INT) #创建存储过程dorepeat1
BEGIN
SET @x = 0;		#设置变量x等于0
REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; #执行循环,直到变量x的值大于p1
END
//
delimiter ;

CALL dorepeat1(10000);	#调用存储过程

SELECT @x;		#查询变量的值
2、创建存储函数
CREATE FUNCTION hello (s CHAR(20))		# 创建存储函数hello
RETURNS CHAR(50) DETERMINISTIC
RETURN CONCAT('Hello, ',s,'!');

select hello('world');  # 调用存储函数
2、触发器
CREATE TABLE test1(a1 INT);  # 创建表test1
CREATE TABLE test2(a2 INT);	 # 创建表test2
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); # 创建表test3
CREATE TABLE test4(
 a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 b4 INT DEFAULT 0
);  # 创建表test4

delimiter |				# 定义分隔符
CREATE TRIGGER testref BEFORE INSERT ON test1 # 创建触发器testref,在往test1插入数据前,触发执行
 FOR EACH ROW	
 BEGIN
 INSERT INTO test2 SET a2 = NEW.a1;    # 往test2表插入数据
 DELETE FROM test3 WHERE a3 = NEW.a1;  # 删除test3表满足条件的数据
 UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;  # 更新test4表满足条件的数据
 END;
|
delimiter ;
#往test3表插入数据
INSERT INTO test3 (a3) VALUES
 (NULL), (NULL), (NULL), (NULL), (NULL),
 (NULL), (NULL), (NULL), (NULL), (NULL);
#往test4表插入数据
INSERT INTO test4 (a4) VALUES
 (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
#往test1表插入数据,触发器testref将会执行
INSERT INTO test1 VALUES 
 (1), (3), (1), (7), (1), (8), (4), (4);

在触发器主体中,OLD和NEW关键字使您能够访问受触发器影响的行中的列。OLD和NEW是MySQL触发器的扩展

在插入触发器中,只能使用NEW.col_name;没有旧行。在删除触发器中,只能使用OLD.col_name;没有新行。在更新触发器中,您可以使用OLD.col_name在更新行之前引用行的列,并使用NEW.col_name在更新行后引用行的列。

触发器不能使用CALL语句来调用将数据返回到客户端或使用动态SQL的存储过程。(允许存储的过程通过OUT或INOUT参数将数据返回到触发器。)

触发器不能使用显式或隐式开始或结束事务的语句,如启动事务、提交或回滚。(允许回滚到保存点,因为它不会结束事务。)

3、事件

MySQL事件调度程序管理事件的调度和执行,即根据调度运行的任务

1、启用和禁用任务调度
SET GLOBAL event_scheduler = ON;
SET @@GLOBAL.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@GLOBAL.event_scheduler = 1;
#同样的,也可以用下面替换
SET GLOBAL event_scheduler = OFF;
SET @@GLOBAL.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@GLOBAL.event_scheduler = 0;

也可以在命令行启动服务时,添加参数

--event-scheduler=DISABLED

同样也可以在服务器配置文件(my.cnf或Windows的my.ini)中,包含服务器读取它的行(例如,在[mysqld]部分中):

event_scheduler=DISABLED
2、创建事件
CREATE EVENT e_insert
 ON SCHEDULE
 EVERY 7 SECOND
 DO
 INSERT INTO myschema.mytable;
4、视图
# 创建表t
CREATE TABLE t (qty INT, price INT);
# 插入数据
INSERT INTO t VALUES(3, 50), (5, 60);
# 创建视图
CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
# 查询视图
SELECT * FROM v;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值