作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
同事们大家好。
我在尝试使用多个连接和条件实现删除前触发器时遇到了一些问题。
我有用户表、组表和连接表以使其成为多对多。
触发的意义是允许删除没有学生的群组,而禁止其他群组。
我现在的代码是:
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 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47996903/
我是一名优秀的程序员,十分优秀!