MySQL триггер в указанное время для создания новых записей в таблице - PullRequest
1 голос
/ 11 февраля 2020

Моя проблема в том, что у меня хранится список учеников, и каждый ученик посещает школу в определенные дни недели. Я хочу создать триггер, который запускается в полночь, который проверяет, в какой день он только что стал, и, если студент посещает этот день, сделает новую запись в базе данных для каждого студента. У меня есть частично созданный с временем l oop, но я знаю, что это не лучшее решение. Одна большая проблема, связанная с этим, как и сейчас, заключается в том, что он будет рисовать все идентификаторы StudentId, а не один идентификатор из строки, которую он изучает в настоящее время. Есть три таблицы, которые будут доступны для студентов, расписания и ClassSession. Студенты и расписание уже созданы, и результатом будет несколько строк в 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 $$

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

Спасибо за понимание!

Редактировать -

Вот так выглядит расписание

StudentId-Monday-Tuesday-Wednesday-Thursday-Friday-Saturday-Sunday
   2374  -   0  -   1   -    0    -    1   -  0   -    0   -  0

В нем хранится крошечный знак / BOOL в дни, когда ученики появляются в классе. Я хочу, чтобы он работал, чтобы он проверял день, а затем проверял, должен ли ученик показывать этот день в классе, и создает новую запись в ClassSchedule, если это так

1 Ответ

0 голосов
/ 11 февраля 2020

Что вам нужно сделать, так это.

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

Вам не нужны ни хранимые процедуры, ни две из них.

Вставьте прямо в расписание, самая сложная часть - это ваша таблица и как получить требуемый студент.

пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...