2010-06-17 3 views
1

J'essaie de créer un trigger sur MySQL mais j'ai un problème de syntaxe que je n'ai pas trouvé. Si quelqu'un plus d'expérience pouvait m'aider ce serait génial (c'est la première fois que j'utilise MySQL!) ...Problèmes avec la syntaxe mysql

La raison pour laquelle je crée ce déclencheur est de supprimer toutes les "étiquettes" orphelines, a une relation many-to-many avec "service_descriptor" (ces deux entités sont liées par service_labels).

Le code que j'ai est:

CREATE TRIGGER `trg_delete_orphan_label` AFTER DELETE 
FOR EACH ROW ON `restdb`.`service_labels` 
    DELETE FROM `restdb`.`labels` 
    WHERE EXISTS (SELECT * 
        FROM old D 
       LEFT_JOIN `restdb`.`service_labels` SL ON SL.`id_label` = D.`id_label` 
                AND D.`id_service` = SL.`id_service` 
        WHERE SL.`id_label` IS NULL 
         `restdb`.`labels`.`id` = D.SL.`id_label`); 

Merci à l'avance!

Répondre

0

Merci à tous ... il résolu Ive finaly à cause de votre aide ...

En fin de compte le travail est:

CREATE TRIGGER trg_delete_orphan_label APRES SUPPRESSION SUR restdb. service_descriptor
POUR CHAQUE RANG SUPPRIMER DE restdb. labelsid PAS ( SELECT restdbservice_labelsid_label DE restdbservice_labels...);

+0

Je suis content que vous ayez trouvé quelque chose qui fonctionne, bien que je remarque que le déclencheur est sur une table différente maintenant. Votre solution est légèrement différente de la mienne tant sur le plan fonctionnel que sur le plan des performances. Votre déclencheur supprime TOUS les orphelins, alors que le mien ne supprime que les lignes nouvellement orphelines. Mon approche sera également plus rapide, donc vous pouvez vouloir le considérer. –

+0

Oui! C'est vrai ... le problème est que ça ne marchait pas quand le trigger était sur la table service_labels, même si l'instruction de suppression fonctionne bien pour les orphelines ... c'est parce que la table service_labes n'était pas effacée directement ... a été supprimé par cacade après service_descriptor ... Pour cette raison j'ai changé la table et à cause de cela j'ai dû changer la logique aussi bien! – Alucard

1

Vous avez manqué et

Essayez ce code

CREATE TRIGGER `trg_delete_orphan_label` AFTER DELETE FOR EACH ROW ON `restdb`.`service_labels` 
    DELETE 
    FROM 
     `restdb`.`labels` 
    WHERE 
     EXISTS (SELECT 
        * 
       FROM 
        old D LEFT_JOIN 
        `restdb`.`service_labels` SL ON 
         SL.`id_label` = D.`id_label` AND 
         D.`id_service` = SL.`id_service` 
       WHERE 
        SL.`id_label` IS NULL AND 
        `restdb`.`labels`.`id` = D.SL.`id_label`       
        ); 
+0

J'ai ajouté un et. Il encore avec un certain problème de syntaxe, cependant ... Merci pour votre soutien! – Alucard

1

Il y a quelques problèmes avec votre détente, notamment la mise en place de « POUR CHAQUE ROW », et la façon dont vous traitez OLD comme une table, quand c'est vraiment juste une rangée.

Cela devrait fonctionner pour vous:

DROP TRIGGER IF EXISTS `trg_delete_orphan_label`; 

CREATE TRIGGER `trg_delete_orphan_label` AFTER DELETE ON `service_labels` 
FOR EACH ROW 
    DELETE FROM `labels` 
    WHERE `id` = OLD.`id_label` 
    AND NOT EXISTS (
     SELECT NULL 
     FROM `service_labels` SL 
     WHERE SL.`id_label` = `labels`.`id`       
    );