2013-06-13 4 views
0

donc j'ai ce test à venir et je fais le test de pratique, mais de toute façon mon déclencheur ne fonctionnera pas. J'ai fait exactement comme on m'a enseigné, mais ça ne marchera pas. Quelqu'un peut-il m'aider?Le trigger MySQL ne fonctionne pas?

i créé cette table:

CREATE TABLE DiscountActions(
discountID int(5) NOT NULL AUTO_INCREMENT, 
dishName varchar(70) NOT NULL, 
type varchar(70) NOT NULL, 
discountPercentage varchar(70) NOT NULL, 
startdate date NOT NULL, 
enddate date NOT NULL, 
PRIMARY KEY (discountID) 
); 

et je veux ajouter ce déclencheur:

DELIMITER // 
CREATE TRIGGER `checkStartDatum` 
AFTER INSERT ON `DiscountActions` 
FOR EACH ROW 
BEGIN 
    IF NEW.startdate < DATE(NOW()) 
    THEN DELETE 
     FROM DiscountActions 
     WHERE startdate = NEW.startdate; 
    END IF ; 
END ; 
// 

mais quand je l'ajoute, l'erreur suivante apparaît: je reçois l'erreur suivante: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser à proximité « DELETE puis de kortingactie OÙ begindatum = NEW.b » à la ligne 6

Qu'est-ce qu'il est censé faire est la suivante: lorsque vous ajoutez un nouveau DiscountAction , il devrait vérifier si le startdate est dans le passé. Si le startdate est dans le passé, il doit supprimer l'action de remise entière, car ce n'est pas possible.

+0

Quelle erreur recevez-vous lorsque vous exécutez cette requête? –

+0

Est-ce que c'est pour MySQL? –

+0

j'obtiens l'erreur suivante: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'THEN DELETE FROM kortingactie O beg begindatum = NEW.b' à la ligne 6 – DragonSlayer666

Répondre

0

Il n'y a rien de syntaxiquement faux avec votre déclencheur. Voici SQLFiddle qui montre que. Mais malheureusement, votre déclencheur ne fonctionnera pas. Vous vous retrouverez avec une erreur lorsque la condition sera remplie

Can't update table 'discountactions' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Maintenant, pour empêcher une insertion d'une ligne si startdate < date actuelle, vous pouvez:

  1. changement un déclencheur AFTER-BEFORE déclencheur
  2. si la condition est remplie, enfreindre simplement l'une des contraintes existantes. Puisque startdate dans votre tableau a une contrainte NOT NULL, nous pouvons l'utiliser.

Voici ce qu'une version de travail de votre déclencheur pourrait ressembler

CREATE TRIGGER checkStartDatum 
BEFORE INSERT ON DiscountActions 
FOR EACH ROW 
    SET NEW.startdate = IF(NEW.startdate < CURDATE(), NULL, NEW.startdate); 

Il est un déclencheur d'une déclaration de sorte que vous ne même pas besoin de changer un delimiter.

Voici SQLFiddle démo. Décommentez la dernière instruction d'insertion et vérifiez que le déclencheur n'autorise pas l'insertion.