2017-12-27 605 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