2017-03-05 1 views
2

J'ai passé beaucoup de temps dessus, mais je n'arrive toujours pas à le résoudre.Pourquoi le déclencheur est-il faux dans MySQL?

Pour certaines raisons que je veux empêcher une même insertion dans la base de données. Donc, je choisis d'utiliser le déclencheur. C'est,

CREATE TRIGGER trigger_card_usage_insert_block 
    BEFORE INSERT ON annual_card_usage_log 
    FOR EACH ROW 
    BEGIN 

    DECLARE lasttime INT; -- hold the last insert time 

    SELECT 
     usage_time INTO lasttime 
    FROM 
     annual_card_usage_log 
    WHERE 
     NEW.card_id = card_id 
    AND NEW.mch_id = mch_id 
    AND NEW.store_id = store_id 
    ORDER BY 
     usage_time DESC 
    LIMIT 1; 

    -- only insert when after 300 second 
    IF(
     lasttime != NULL 
     AND(lasttime + 300 < new.usagetime) 
    ) THEN 
     INSERT INTO annual_card_usage_log(
      card_id , 
      mch_id , 
      store_id , 
      usage_time 
     ) 
    VALUES 
     (
      NEW.card_id , 
      NEW.mch_id , 
      NEW.store_id , 
      NEW.usage_time 
     ); 
    END 
    IF; 

    END$ 

Ceci est le code de création. Et ci-dessous est le tableau,

CREATE TABLE `annual_card_usage_log` (
     `usage_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', 
     `card_id` int(10) unsigned NOT NULL COMMENT '', 
     `mch_id` int(10) unsigned NOT NULL COMMENT '', 
     `store_id` int(10) DEFAULT NULL, 
     `usage_time` int(10) NOT NULL COMMENT '', 
     PRIMARY KEY (`usage_id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

Malheureusement, je ne peux pas créer le déclencheur, il semble faux. Peux-tu me dire pourquoi? Quel code est faux. J'utilise le client mysql appelé Sequel Pro, et quand je lance le sql j'ai un message d'erreur "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 '' à la ligne 6 Exécution arrêtée! " Je ne suis pas la raison maintenant.

+0

* impossible de créer le déclencheur * - pourquoi exactement? – anatol

+0

@anatol J'utilise le client mysql appelé Sequel Pro, et quand je lance le sql j'ai un message d'erreur "Vous avez une erreur dans votre syntaxe SQL, consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser '' à la ligne 6 Exécution arrêtée! " Je ne suis pas la raison maintenant. – blackdog

+0

C'est informations utiles, s'il vous plaît ajouter à votre question – anatol

Répondre

1

Grâce à @anatol, je le résous. J'ai changé le chemin. J'ai mis la valeur à une donnée invalide. Ensuite, créez un travail pour supprimer les données non valides. Le déclencheur ne peut pas être inséré dans une même table car il provoquera une boucle sans fin, comme le signale @anatol.

DELIMITER $$ 
    CREATE TRIGGER triger_card_usage_insert_block BEFORE INSERT ON annual_card_usage_log FOR EACH ROW 
    BEGIN 

    DECLARE lasttime INT(10) ; 
    SET lasttime =(
     SELECT 
      usage_time 
     FROM 
      annual_card_usage_log 
     WHERE 
      NEW.card_id = card_id 
     AND NEW.mch_id = mch_id 
     AND NEW.store_id = store_id 
     ORDER BY 
      usage_time DESC 
     LIMIT 1 
    ) ; 
    IF (lasttime + 300 > new.usage_time) THEN 
    SET new.new_card_id = new.card_id; 
    SET new.card_id = 0 ; 
    END 
    IF ; 
    END$$ 
    DELIMITER ;