假设我们要创建一个简单的数据库,其中包含两张表: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)