MySQL在指定时间触发,以在表中创建新条目

MySQL在指定时间触发,以在表中创建新条目,mysql,stored-procedures,triggers,Mysql,Stored Procedures,Triggers,我的问题是,我保存了一份学生名单,每个学生在一周中的某些日子上学。我想创建一个在午夜运行的触发器,检查它是哪一天,如果一个学生参加了那一天,将为每个学生在数据库中创建一个新条目。我有一个部分创建了while循环,但我知道这不是最好的解决方案。现在这样做的一个大问题是,它将绘制所有的StudentId,而不是当前正在检查的行中的单个ID。这将访问三个表:学生、时间表和课堂。学生和时间表已经生成,结果将是ClassSession中包含StudentId和CurrentDate的多行 CREATE E

我的问题是,我保存了一份学生名单,每个学生在一周中的某些日子上学。我想创建一个在午夜运行的触发器,检查它是哪一天,如果一个学生参加了那一天,将为每个学生在数据库中创建一个新条目。我有一个部分创建了while循环,但我知道这不是最好的解决方案。现在这样做的一个大问题是,它将绘制所有的StudentId,而不是当前正在检查的行中的单个ID。这将访问三个表:学生、时间表和课堂。学生和时间表已经生成,结果将是ClassSession中包含StudentId和CurrentDate的多行

CREATE EVENT NewDailyTables
ON SCHEDULE
    EVERY 1 DAY
    STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY)
  DO
    CALL CreateDayTriggerWhile();

------------------------------------------------------------------------------------------------------

DELIMITER $$
CREATE PROCEDURE `cnp_data`.`CreateDayTriggerWhile` ()
BEGIN
    SET @ThisEnd=0;
    SET @Count=0;
    SET @ThisId=0;
    SELECT COUNT(*) FROM Schedule INTO @ThisEnd;
    WHILE @Count<@ThisEnd DO
        SELECT StudentId FROM Schedule INTO @ ThisId; /* takes all student id's. Unsure of how to write WHERE row=@count*/
        CALL CreateDayTriggerHelp(@ThisId);
    END WHILE;
END $$

------------------------------------------------------------------------------------------------------

DELIMITER $$
CREATE PROCEDURE `cnp_data`.`CreateDayTriggerHelp` (IN ThisId INT)
BEGIN

    SET @DayName = DAYNAME(CURRENT_DATE);
    IF (SELECT ThisId FROM Schedule WHERE @DayName=1)=true
        THEN
            INSERT INTO ClassSession (StudentId, CurrentDate)
                VALUES (ThisId, CURRENT_DATE);
        END IF;
END $$

-------------------------------------------------------------------------------------------------------


在学生上课的日子里,它会储存一个罐头盒。我想让它工作的方式是,它检查当天,然后查看学生是否应该在当天上课,并在课表中创建新条目,如果是这样的话,你必须做的就是这样

INSERT INTO
ClassSession 
    (`StudentId` ,  `CurrentDate` )
SELECT
  `StudentId`,
  CURRENT_DATE
FROM
  schedule
Where  
  CASE
    WHEN DAYOFWEEK(NOW()) =  2 AND `Monday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  3 AND `Tuesday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  4 AND `Wednesday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  5 AND `Thursday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  6 AND `Friday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  6 AND `Saturday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  1 AND `Sunday` = 1 = 1 THEN 1
    ELSE 0
  END > 0
您不需要一个或两个存储过程

直接插入时间表,棘手的部分是你的表格和如何获得所需的学生ID


你要做的就是这样

INSERT INTO
ClassSession 
    (`StudentId` ,  `CurrentDate` )
SELECT
  `StudentId`,
  CURRENT_DATE
FROM
  schedule
Where  
  CASE
    WHEN DAYOFWEEK(NOW()) =  2 AND `Monday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  3 AND `Tuesday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  4 AND `Wednesday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  5 AND `Thursday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  6 AND `Friday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  6 AND `Saturday` = 1 THEN 1
    WHEN DAYOFWEEK(NOW()) =  1 AND `Sunday` = 1 = 1 THEN 1
    ELSE 0
  END > 0
您不需要一个或两个存储过程

直接插入时间表,棘手的部分是你的表格和如何获得所需的学生ID


这毫无意义,从@DayName=1@DayName为星期二的日程表中选择ThisId怎么可能是1?您需要一个循环,该循环从coluane=DAYNAME(当前_日期)的计划中获取SELECT StudentId的所有结果;并插入每个stiendt id。去掉第二个过程,但也请加上表格时间表,以便有人能写出正确的过程。我明白你的意思。我想让它工作的原因是@DayName取代了列名,并检查它是0还是1。我只是不明白你为什么要这样做。当用户需要某些信息时,他们可以简单地执行查询;这就是它通常的工作方式。而且,这不是在RDBMS中存储时间表的方式。数据库表不是电子表格。这没有任何意义。从@DayName=1@DayName为星期二的计划中选择ThisId怎么可能是1?您需要一个循环,该循环从coluane=DAYNAME(当前_日期)的计划中获取SELECT StudentId的所有结果;并插入每个stiendt id。去掉第二个过程,但也请加上表格时间表,以便有人能写出正确的过程。我明白你的意思。我想让它工作的原因是@DayName取代了列名,并检查它是0还是1。我只是不明白你为什么要这样做。当用户需要某些信息时,他们可以简单地执行查询;这就是它通常的工作方式。而且,这不是在RDBMS中存储时间表的方式。数据库表不是电子表格。感谢您的帮助。以此为指导,我创建了一个可以根据需要工作的触发器!谢谢你的洞察力。以此为指导,我创建了一个可以根据需要工作的触发器!