2016-09-25 53 views
0

有一个表,这个模式触发器以防止在条件缺失的MySQL

表演(PerformerID,PerformerName,街道,城市,省,邮编,ActivityID)

我需要定义一个触发器如果删除的ActivityID对于表是唯一的,则防止删除。换句话说,如果某人尝试删除一个Performer,当他/她是唯一一个具有某个ActivityID的整个表时,触发器应该触发并避免删除。否则触发不应该中断。

我试过下面的代码,但它给我一个语法错误。

CREATE TRIGGER deletePerformer BEFORE DELETE ON Performers 
FOR EACH ROW 
BEGIN 
If (Performers.ActivityID FROM INSERTED != Performers.ActivityID FROM Peformers) 
Begin 
RAISERROR ('Deletion is Not Allowed!', 16, 1) 
Return 
End 
END; 

任何帮助是非常赞赏。

回答

1

正确的语法会是这个样子:

DELIMITER $$ 

CREATE TRIGGER deletePerformer BEFORE DELETE ON Performers 
FOR EACH ROW 
BEGIN 
    If (NOT EXISTS (SELECT 1 
        FROM Performers p2 
        WHERE p2.ActivityID = old.ActivityId AND 
          p2.PerformerID <> old.PerformerId 
        ) 
     ) THEN 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Deletion is Not Allowed!'; 
    End if; 
END 

$$ 

DELIMITER ; 

我没有,但是,相信这是强制要执行规则的最佳方法。

+0

感谢您的回答。 'Return'和'End if'之后的那些分号不应该在那里吗?我删除了它们并尝试了你的代码,但它仍然给我第11行上的错误.. – Arcane

+0

错误1064(42000):你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在'('Deletion is Not Allowed',16,1)附近使用正确的语法“ 返回 End if END'at line 11 – Arcane

+0

@Arcane。 。 。这是有道理的,因为'RAISEERROR'是SQL Server使用的。 MySQL使用'SIGNAL'。 –