1

MySQLでトリガーを作成しようとしていますが、構文に問題があり、見つけることができませんでした。もっと経験のある人が私を助けてくれるなら、それは素晴らしいことです(MySQLを使うのは初めてです!)...

このトリガーを作成する理由は、「service_descriptor」と多対多の関係にあるすべての孤立した「ラベル」を削除するためです(この2つのエンティティはservice_labelsによってリンクされています)。

私が持っているコードは次のとおりです。

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`); 

前もって感謝します !

4

3 に答える 3

1

あなたが逃したそして

このコードを試してください

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`                         
                    );  
于 2010-06-17T14:22:07.033 に答える
1

トリガーにはいくつかの問題があります。最も顕著なのは「FOR EACH ROW」の配置と、実際には単なる行である場合に OLD をテーブルのように扱う方法です。

これはあなたのために働くはずです:

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`                        
    );                     
于 2010-06-17T16:09:43.850 に答える
0

みんなありがとう...あなたの助けのおかげで私は最終的にそれを解決しました...

結局のところ、作業は次のとおりです。

trg_delete_orphan_label削除後にトリガーを作成しrestdbます。service_descriptor
各行の削除元restdblabels WHERE idNOT IN(SELECT .. FROM restdb。)service_labels;id_labelrestdbservice_labels

于 2010-06-17T18:31:38.610 に答える