2012-12-04 192 views

回答

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 

没考所以原谅语法错误,但这个想法应该清楚。

在此日期允许这种工作时间的员工删除,直到只有一个离开

EDIT 2 重读你的问题,更新失败条件

+0

你能如何做详细说明失败的条件?我尝试使用DISTINCT,但它不让我。 –

+0

增加了一个具体的例子 –

+0

在LIMIT 1之前你有table1,那是指什么? –