MySQL: Почему мой триггер никогда не добавляет 7 дней? - PullRequest
2 голосов
/ 23 февраля 2020

Мой стол:

CREATE TABLE `files_processed` (
  `filename` varchar(128) NOT NULL,
  `uploaded_by` varchar(64) NOT NULL,
  `domain` varchar(255) NOT NULL,
  `session_id` varchar(64) NOT NULL,
  `datetime_uploaded` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `insert_data` tinyint(1) NOT NULL DEFAULT '1',
  `generate_positives` tinyint(1) DEFAULT '1',
  `generate_negatives` tinyint(1) NOT NULL DEFAULT '0',
  `custom_rules` tinyint(1) NOT NULL DEFAULT '0',
  `processing_stage` enum('completed','underway','wait','') NOT NULL DEFAULT 'wait',
  `scheduled_processing_datetime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Мой триггер:

DELIMITER $$
CREATE TRIGGER `setProcessingData` BEFORE INSERT ON `files_processed` FOR EACH ROW BEGIN
   DECLARE vNextDtTime datetime;
   DECLARE vDom varchar(255);
   SET vDom = new.domain;
   SET new.session_id=new.domain;

   SELECT max(scheduled_processing_datetime)
   INTO vNextDtTime
   FROM files_processed     
   WHERE domain='@vDom';
   IF (ISNULL(vNextDtTime)) 
   THEN
        SET vNextDtTime := now();
        ELSE
        SET vNextDtTime := DATE_ADD(vNextDtTime, interval 7 day);
        END IF;
   SET new.scheduled_processing_datetime := vNextDtTime;
END
$$
DELIMITER ;

Мои 2 вставки: ВСТАВИТЬ INTO files_processed (имя файла, uploaded_by, домен) VALUES ('1.txt', 'hcs. dfc@gmail.com', 'gmail.com'); Выше вставляется текущая метка времени, которая, как и ожидалось,

INSERT INTO files_processed (filename, uploaded_by, domain)
VALUES ('2.txt', 'hcs.dfc@gmail.com', 'gmail.com');

Теперь для этого выше, я ожидаю, что триггер добавит 7 дней, но он все еще обрабатывается как текущая метка времени.

1 Ответ

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

vDom не равно @ vdom

Если вы введете переменную, она работает

@ переменные являются переменными сеанса, которые могут быть установлены и выбраны после вставки.

Другой считает, что лучше назвать переменную _vDom, чтобы вы знали, даже в больших триггерах, что это локальная переменная

DROP TRIGGER IF EXISTS `setProcessingData`;
DELIMITER $$
CREATE TRIGGER `setProcessingData` BEFORE INSERT ON `files_processed` FOR EACH ROW BEGIN
   DECLARE vNextDtTime datetime;
   DECLARE vDom varchar(255);
   SET vDom = new.domain;
   SET new.session_id=new.domain;

   SELECT max(scheduled_processing_datetime)
   INTO vNextDtTime
   FROM files_processed     
   WHERE domain= vDom;
   IF (ISNULL(vNextDtTime)) 
   THEN
        SET vNextDtTime := now();
        ELSE
        SET vNextDtTime := DATE_ADD(vNextDtTime, interval 7 day);
        END IF;
   SET new.scheduled_processing_datetime := vNextDtTime;
END
$$
DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...