Проблемы с mysql синтаксисом

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

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

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

1
задан OMG Ponies 17 June 2010 в 15:55
поделиться

3 ответа

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

В итоге работа такова:

СОЗДАТЬ ТРИГГЕР trg_delete_orphan_label ПОСЛЕ УДАЛЕНИЯ НА restdb . service_descriptor
ДЛЯ КАЖДОЙ СТРОКИ УДАЛИТЬ ИЗ restdb . ярлыки ГДЕ id НЕ В ( ВЫБЕРИТЕ restdb . service_labels . id_label ИЗ restdb . service_labels );

0
ответ дан 2 September 2019 в 23:42
поделиться

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

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

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`                         
                    );  
1
ответ дан 2 September 2019 в 23:42
поделиться

Есть несколько проблем с триггером, в первую очередь с размещением "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
ответ дан 2 September 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: