2010-06-17 56 views
1

我試圖在MySQL上創建一個觸發器,但是我有一個語法問題,我無法找到它。如果有人有更多的經驗可以幫助我,這將是巨大的(這是我第一次使用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`); 

謝謝!

回答

0

謝謝大家......從來就finaly解決了這個問題,因爲你的幫助......

到底的工作是:

CREATE TRIGGER trg_delete_orphan_label刪除後restdbservice_descriptor
FOR EACH ROW 刪除從restdblabels WHERE id NOT IN(SELECT restdbservice_labelsid_label FROM restdbservice_labels。);

+0

我很高興你發現了一些有用的東西,但我注意到現在觸發器在不同的桌子上。您的解決方案在功能和性能方面與我的解決方案略有不同。你的觸發器正在刪除所有的孤兒,而我的只會刪除新的孤兒行。我的方法也會更快,所以您可能需要考慮。 – 2010-06-17 20:54:16

+0

是的!這是事實......問題在於,當觸發器位於service_labels表中時,即使刪除語句​​對孤兒的語句正常工作,它也不起作用......這是因爲service_labes表沒有被直接刪除......它在service_descriptor後被cacade刪除... 因爲這個原因,我改變了表格,因此我必須改變邏輯! – Alucard 2010-06-18 15:34:11

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

我添加了一個和。它仍然有一些語法問題,雖然... 感謝您的支持! – Alucard 2010-06-17 14:29:33

1

有幾個問題,你的觸發,最顯着的位置「FOR EACH ROW」,和你對待老辦法像一張桌子,當它真的只是一排。

這應該爲你工作:

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