MySQL BEFORE DELETE触发器具有双连接和条件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL BEFORE DELETE触发器具有双连接和条件相关的知识,希望对你有一定的参考价值。
你好,同事们。
尝试使用多个连接和条件实现删除前触发器时,我遇到了一个问题。
我有用户表,组表和连接表,以使其多对多。
触发感是允许删除没有学生的组,并禁止其他组。
我现在的代码是:
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 ;
它通过了语法检查但不起作用。有什么建议吗?
提前致谢。
答案
我不知道为什么你不想使用外键和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 ;
以上是关于MySQL BEFORE DELETE触发器具有双连接和条件的主要内容,如果未能解决你的问题,请参考以下文章