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

时间:2012-12-04 01:26:30

标签: mysql triggers distinct

我需要制作一个可以防止删除员工的触发器。

1 个答案:

答案 0 :(得分:1)

来自trigger documentation

  

触发器不能使用显式或隐式开始或结束事务的语句,例如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 重新阅读您的问题并更新失败条件