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?
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.
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
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 !!!