mysql 创建存储过程,并通过事件执行

一、创建存储过程并管理(也可不创建)

1. 创建存储过程
-- 修改分隔符(避免与存储过程内的分号冲突)
DELIMITER $$

-- 创建存储过程
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
  -- 存储过程逻辑(SQL语句)
  SELECT 'Hello World';
END$$

-- 恢复分隔符
DELIMITER ;

2. 查看存储过程
(1)查看所有存储过程基本信息
-- 查看当前数据库的存储过程
SHOW PROCEDURE STATUS WHERE Db = '数据库名';
例:
SHOW PROCEDURE STATUS WHERE Db = 'hz_fw_game';
(2)查看存储过程的创建代码
-- 查看指定存储过程的定义
SHOW CREATE PROCEDURE 存储过程名;
例:
SHOW CREATE PROCEDURE update_fw_game_fenlei;

3. 修改存储过程
MySQL 不支持直接修改存储过程内容,需先删除再重建,或通过ALTER修改部分属性(如注释、权限):


4. 删除存储过程
DROP PROCEDURE IF EXISTS 存储过程名;

5. 执行存储过程
-- 无参数
CALL 存储过程名();

-- 有参数(例如传入id=1)
CALL 存储过程名(1);

实践案例:

(一)先设置leitian默认值为-1,如果需要可以手动进行设置大于0的数

update fw_game set leitian = -1;

(二)选择相应的数据库之后,运行下面的SQL语句:

DELIMITER $$  -- 临时修改分隔符,避免存储过程中的分号冲突

CREATE PROCEDURE update_fw_game_fenlei()
BEGIN
  -- 1. 先将leitian>0的记录减1
  UPDATE fw_game SET leitian = leitian - 1 WHERE leitian > 0 and state = '1';
  
  -- 2. 再将leitian=0且wutian=0且fenlei='2'的记录,把fenlei改为'0'
  UPDATE fw_game SET fenlei = '0',vip2='免费GM' WHERE leitian = 0 AND fenlei = '2';
END$$

DELIMITER ;  -- 恢复默认分隔符

之后刷新,就会在表的上面看到已创建的存储过程

CREATE EVENT IF NOT EXISTS update_fenlei_event
ON SCHEDULE EVERY 1 DAY
STARTS '2025-11-02 00:00:00' -- 开始时间
DO
CALL update_fw_game_fenlei(); -- 调用存储过程

图形化界面显示如下:

二、创建事件,进行每天执行语句

1. 检查事件调度器状态

首先,你需要检查事件调度器是否开启。可以使用以下 SQL 命令来查看当前状态:

SHOW VARIABLES LIKE 'event_scheduler';

如果返回的是 OFF,你需要开启它。

2. 开启事件调度器

如果事件调度器是关闭的,你可以使用以下命令来开启它:

SET GLOBAL event_scheduler = ON;

或者,你可以在 MySQL 配置文件(通常是 my.cnf 或 my.ini)中设置:

[mysqld]

event_scheduler=ON

然后重启 MySQL 服务。

3. 创建事件

一旦事件调度器开启,你就可以创建事件了。使用 CREATE EVENT 语句来创建一个新的事件。例如,创建一个每天自动运行的简单事件:

CREATE EVENT my_event
ON SCHEDULE EVERY 1 DAY
STARTS (TIMESTAMP(CURRENT_DATE, '00:00:00'))
DO
  UPDATE my_table SET column_name = value_to_set WHERE some_condition;

这个例子中,my_event 会在每天午夜自动执行,更新 my_table 表中的记录。

4. 查看事件

要查看当前定义的所有事件,可以使用:

SHOW EVENTS;
 

5. 修改或删除事件

如果你需要修改一个已存在的事件,可以使用 ALTER EVENT 语句。例如:

ALTER EVENT my_event DISABLE;  -- 禁用事件
ALTER EVENT my_event ENABLE;   -- 启用事件
要删除一个事件,使用:

DROP EVENT IF EXISTS my_event;
 

注意事项:

  • 确保在创建事件时考虑到性能影响,因为频繁的事件执行可能会对数据库性能产生影响。
  • 考虑到时区问题,尤其是在跨时区操作时,确保使用正确的时区设置。可以通过设置会话或全局时区来解决:

SET GLOBAL time_zone = '+00:00';  -- 设置全局时区为 UTC+0
SET time_zone = '+00:00';         -- 设置当前会话时区为 UTC+0
使用 ON COMPLETION PRESERVE 或 ON COMPLETION NOT PRESERVE 来控制事件完成后的行为。默认情况下,如果事件不再符合其调度条件,它会被自动删除。使用 PRESERVE 可以保持它不被自动删除。例如:

CREATE EVENT my_event ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY ON COMPLETION PRESERVE DO ...;
通过以上步骤,你可以在 MySQL 中成功创建和管理自动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值