MySQL BEFORE DELETE触发器具有双连接和条件

时间:2017-12-27 18:22:05

标签: mysql triggers

您好,同事。

尝试使用多个连接和条件实现删除触发器之前,我遇到了一些问题。

我有用户表,组表和连接表,以使其多对多。

触发感是允许删除没有学生的群体,并禁止其他群体。

我现在的代码是:

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 ;

它通过了语法检查,但不起作用。有什么建议吗?

提前致谢。

1 个答案:

答案 0 :(得分: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 ;