MySQL-通过连接的表防止删除的触发器

MySQL-通过连接的表防止删除的触发器,mysql,triggers,distinct,Mysql,Triggers,Distinct,我需要做一个触发器,防止删除员工 来自: 触发器不能使用显式或隐式开始或结束事务的语句,如START transaction、COMMIT或ROLLBACK 所以通常这是不可能的。 当你想让整个交易失败时,你能做的就是强制你的触发器出错:例如 CREATE TRIGGER t1 BEFORE DELETE ON table1 FOR EACH ROW BEGIN IF (failCondition) THEN SELECT 1/0 FROM table1 LIM

我需要做一个触发器,防止删除员工

来自:

触发器不能使用显式或隐式开始或结束事务的语句,如START transaction、COMMIT或ROLLBACK

所以通常这是不可能的。 当你想让整个交易失败时,你能做的就是强制你的触发器出错:例如

CREATE TRIGGER t1 BEFORE DELETE ON table1
FOR EACH ROW
BEGIN
      IF (failCondition) THEN
           SELECT 1/0 FROM table1 LIMIT 1
      END IF;
END
这将触发一个错误并回滚整个事务

编辑:

所以对于你的问题,应该是这样的

CREATE TRIGGER preventLastStaffDeletion BEFORE DELETE ON Admission
FOR EACH ROW
BEGIN
      DECLARE remaining INT DEFAULT 0;
      SET remaining := (SELECT COUNT(staff) FROM Admission WHERE the_date = OLD.the_date AND work_time = OLD.work_time );
      IF remaining = 1 THEN
           SELECT 1/0 FROM Admission LIMIT 1
      END IF;
END
没有测试所以原谅语法错误,但是想法应该很清楚

允许删除在此日期具有此工作时间的员工,直到只剩下一名

编辑2
重新阅读您的问题并更新失败条件

您能否详细说明如何执行失败条件?我尝试使用DISTINCT,但它不允许我使用。在限制1之前,您有表1,这指的是什么?数据库中的任何表,如果您愿意,都可以使用。这会导致一个错误,它本来是要导致一个错误的,但是要安装触发器,这必须是一个现有的表。在修改了你给我的东西之后,它工作得非常好。谢谢你的帮助!如果您使用的是MySQL>=5.5,则信号是一个选项。还是个解决办法