web-dev-qa-db-fra.com

Comparer les dates dans un déclencheur avant insertion

J'ai besoin d'aide pour faire un TRIGGER qui compare deux dates entrées dans une table, mais je ne suis pas à 100% sur la syntaxe que je devrais utiliser.

Quelque chose comme:

CREATE TRIGGER chk_dates
   BEFORE INSERT ON `job_history`
   FOR EACH ROW
    BEGIN
      IF( NEW.end_date < OLD.start_date ) .../// error, don't insert data
      ELSE .../// allow the data to be entered

Ma table job_history aura un start_date, et quand end_date est entré, je veux que cela vérifie que ce ne soit pas avant start_date.

Comment puis-je accomplir cela?

3
RCNeil

Avec MySQL 5.5 ou 5.6, vous pouvez utiliser [~ # ~ # ~] [~ # ~] au lieu des hacks à caution à partir d'une gâchette.

Aussi, sur un BEFORE INSERT déclencheur, seul l'alias NEW est utilisé. Pas OLD.

CREATE TRIGGER chk_dates
BEFORE INSERT ON `job_history`
FOR EACH ROW
BEGIN
  IF (NEW.end_date < NEW.start_date) THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'end_date cannot be earlier than start_date';
  END IF;
END;

Non "sinon" n'est nécessaire car ne prend aucune mesure dans un BEFORE déclencheur permet à l'action initiale de procéder.

4
Michael - sqlbot

Je ne suis pas très fier de ce que je suis sur le point de vous montrer mais ça doit être fait

Retour le 25 avril 2011 J'ai écrit ce message: déclencheur dans MySQL pour empêcher l'insertion

Il explique comment interrompre une gâchette médiane. Vous le faites en lançant délibérément une instruction SQL syntaxiquement correcte mais rompt sur l'exécution. Cela a toujours été suggéré à l'origine sur pages 254-256 du livre

enter image description here

parce que le traitement du signal n'est pas correctement implémenté (OK, il n'a pas été mis en œuvre un lick)

En ce qui concerne votre something like code, il devrait ressembler à quelque chose comme ça:

CREATE TRIGGER chk_dates
   BEFORE INSERT ON `job_history`
   FOR EACH ROW
    BEGIN
      DECLARE x INT;
      IF( NEW.end_date < OLD.start_date ) THEN
          SELECT dummy INTO x FROM mysql.user WHERE 1=1 LIMIT 1;
      ELSE .../// allow the data to be entered

Essaie !!!

2
RolandoMySQLDBA