mysql存储过程定时调度

假设我们要创建一个简单的数据库,其中包含两张表:students 表和 courses 表,以及一个存储过程用于插入学生数据。下面是完整的建表语句、插入语句和存储过程:

1】建表

-- 创建 courses 表
CREATE TABLE courses (
    course_id INT AUTO_INCREMENT PRIMARY KEY,
    course_name VARCHAR(100) NOT NULL,
    credit INT
);


-- 创建 students 表
CREATE TABLE students (
    student_id INT AUTO_INCREMENT PRIMARY KEY,
    student_name VARCHAR(50) NOT NULL,
    age INT,
    gender ENUM('Male', 'Female', 'Other'),
    course_id INT,
    FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE ON UPDATE CASCADE
);


解释:

courses 表包含课程信息,其中 course_id 是主键字段,course_name 是课程名称字段,credit 是学分字段。

students 表包含学生信息,其中 student_id 是主键字段,student_name 是学生姓名字段,age 是年龄字段,gender 是枚举类型字段,course_id 是外键字段,关联到 courses 表的 course_id 字段

2】插入数据

-- 插入课程数据
INSERT INTO courses (course_name, credit) VALUES
    ('Mathematics', 4),
    ('Physics', 3),
    ('History', 2);

-- 插入学生数据
INSERT INTO students (student_name, age, gender, course_id) VALUES
    ('Alice', 20, 'Female', 1),
    ('Bob', 22, 'Male', 2),
    ('Eve', 19, 'Female', 1),
    ('Mike', 21, 'Male', 3);

3】创建存储过程

-- 创建存储过程,用于插入学生数据
DELIMITER //
CREATE PROCEDURE InsertStudent(IN student_name VARCHAR(50), IN age INT, IN gender ENUM('Male', 'Female', 'Other'), IN course_id INT)
BEGIN
    INSERT INTO students (student_name, age, gender, course_id) VALUES (student_name, age, gender, course_id);
END;
//
DELIMITER ;


-- 创建存储过程 UpdateAge,用于更新整个表的 age 字段:
DELIMITER //
CREATE PROCEDURE UpdateAge()
BEGIN
    UPDATE students SET age = age + 1;
END;
//
DELIMITER ;

 4】定时调度存储过程

在 MySQL 中,存储过程本身是不支持定时调度的。不过,你可以借助 MySQL 的事件调度器(Event Scheduler)来实现定时调度存储过程的执行。事件调度器是 MySQL 中的一个功能,可以周期性地执行一些指定的操作,包括调用存储过程

首先,需要确保 MySQL 的事件调度器已经启用。可以在 MySQL 客户端或者其他管理工具中执行以下语句来检查是否启用事件调度器:

SHOW VARIABLES LIKE 'event_scheduler';

如果结果为 ON,表示事件调度器已经启用;如果结果为 OFF,表示事件调度器未启用。如果未启用,可以通过以下语句来启用事件调度器:

SET GLOBAL event_scheduler = ON;
DELIMITER //
CREATE EVENT IF NOT EXISTS schedule_insert_student
ON SCHEDULE EVERY 1 MINUTE
DO
BEGIN
    CALL InsertStudent('John', 25, 'Male', 1);
END;
//
DELIMITER ;


DELIMITER //
CREATE EVENT IF NOT EXISTS schedule_update_age
ON SCHEDULE EVERY 1 MINUTE
DO
BEGIN
    CALL UpdateAge();
END;
//
DELIMITER ;

事件调度器将会每分钟执行一次,调用 InsertStudent 存储过程插入一条名为 "John" 的学生数据到 students 表中;调用了 UpdateAge 存储过程,将 students 表中的所有学生的年龄 age 加上 1。

调度几分钟之后(此时只运行了 schedule_insert_student)

再调度几分钟之后(此时运行了 schedule_insert_student、schedule_update_age)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值