Я пытаюсь создать триггер на 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`);
Заранее спасибо!
Спасибо всем ... Я наконец решил это благодаря вашей помощи ...
В итоге работа такова:
СОЗДАТЬ ТРИГГЕР trg_delete_orphan_label
ПОСЛЕ УДАЛЕНИЯ НА restdb
. service_descriptor
ДЛЯ КАЖДОЙ СТРОКИ
УДАЛИТЬ ИЗ restdb
. ярлыки
ГДЕ id
НЕ В (
ВЫБЕРИТЕ restdb
. service_labels
. id_label
ИЗ restdb
. 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 AND
`restdb`.`labels`.`id` = D.SL.`id_label`
);
Есть несколько проблем с триггером, в первую очередь с размещением "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`
);