使用双连接和条件删除触发器之前的MySQL

使用双连接和条件删除触发器之前的MySQL,mysql,triggers,Mysql,Triggers,各位同事好。 我在尝试使用多个连接和条件实现删除前触发器时遇到了一个问题 我有一个用户表,一个组表和一个连接表来实现多对多 触发的意义是允许删除没有学生的组,并禁止其他组 我现在的代码是: DELIMITER // CREATE TRIGGER groups_before_delete BEFORE DELETE ON groups FOR EACH ROW BEGIN DECLARE students int; SET students = (SELECT count

各位同事好。

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

我有一个用户表,一个组表和一个连接表来实现多对多

触发的意义是允许删除没有学生的组,并禁止其他组

我现在的代码是:

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 ;
它通过了语法检查,但不起作用。有什么建议吗


提前感谢。

我不知道您为什么不想使用外键和
上的删除限制
的更好解决方案

但是,要使用触发器停止删除,当任何学生与该组相关时,您需要引发错误。而且不需要任何连接。您需要读取的唯一表格是
student\u to\u group
。您也不需要计算组中的所有学生。您只需要知道是否有任何学生与该组有联系,最好使用
EXISTS

要引发错误,可以使用命令


最好在删除限制时使用
定义外键。是的,我知道那条路。外键是另一种方式,问题是如何使用触发器实现。谢谢你,很好用,谢谢。非常好的优化决策。
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 ;