Проблемы с синтаксисом mysql - PullRequest
1 голос
/ 17 июня 2010

Я пытаюсь создать триггер на MySQL, но у меня проблема с синтаксисом, которую я не смог найти.Если бы кто-то еще мог помочь мне, это было бы здорово (это первый раз, когда я использую MySQL!) ...

Причина, по которой я создаю этот триггер, заключается в удалении всех потерянных "меток", который имеет отношение «многие ко многим» с «service_descriptor» (эти две сущности связаны с помощью 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`); 

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 17 июня 2010

У вашего триггера есть пара проблем, особенно это касается размещения «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`                        
    );                     
1 голос
/ 17 июня 2010

Вы пропустили И

Попробуйте этот код

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 голосов
/ 17 июня 2010

Спасибо всем ... Я наконец-то решил это из-за вашей помощи ...

В конце концов работа:

CREATE TRIGGER trg_delete_orphan_label ПОСЛЕ УДАЛЕНИЯ НА restdb. service_descriptor
ДЛЯ КАЖДОГО РЯДА УДАЛИТЬ ИЗ restdb. labels ГДЕ id НЕ ВХОДИТ (ВЫБРАТЬ restdb. service_labels. id_label ОТ restdb. service_labels);

...