2017-12-27 116 views
0

你好,同事。MySQL之前刪除觸發器雙連接和條件

我有樣的一個問題試圖刪除觸發器有多個連接和條件之前實施

我有用戶表,組和連接表,使它成爲許多。

觸發的感覺是允許刪除沒有學生的組,並禁止其他人。

我對現在的代碼是:

DELIMITER // 

CREATE TRIGGER 
    groups_before_delete BEFORE DELETE ON groups 
FOR EACH ROW 
BEGIN 

    DECLARE students int; 

    SET students = (SELECT 
    count(title) 
    FROM 
    users u 
    INNER JOIN student_to_group stg ON (u.id = stg.student_id) 
    INNER JOIN groups g ON (stg.group_id = g.id) 
    GROUP BY 
    group_id 
    HAVING 
    group_id = OLD.id); 

    IF students = 0 THEN DELETE FROM groups where id = OLD.id; 
    END IF; 

END;// 

DELIMITER ; 

它通過語法檢查,但不起作用。有什麼建議嗎?

在此先感謝。

+0

更好地用'ON DELETE RESTRICT'定義一個外鍵。 https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html –

+0

是的,我知道這種方式。外鍵是另一種方式,問題是如何用觸發器來實現。不管怎麼說,還是要謝謝你。 – Bandydan

回答

1

我不知道你爲什麼不想用外鍵和ON DELETE RESTRICT更好的解決方案。

但是 - 要停止使用觸發器進行刪除,您需要在任何學生與該組關聯時發出錯誤。並且不需要任何連接。您需要閱讀的唯一表格是student_to_group。你也不需要統計組中的所有學生。你只需要知道是否有學生與這個組相關聯,最好用EXISTS完成。

要引發錯誤,您可以使用SIGNAL命令。

DELIMITER // 

CREATE TRIGGER 
    groups_before_delete BEFORE DELETE ON groups 
FOR EACH ROW 
BEGIN 

    IF EXISTS (SELECT * FROM student_to_group stg WHERE stg.group_id = OLD.id) THEN 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete a group which has students'; 
    END IF; 

END// 

DELIMITER ; 
+0

完美的作品,謝謝。非常好的優化決策。 – Bandydan