BEFORE DELETE触发器

时间:2014-01-31 01:02:04

标签: sql triggers

如何停止删除具有触发器的另一个表(没有FK)中的PK的行? CALL cannot_delete_error会停止删除吗? 这是我到目前为止所得到的。

CREATE TRIGGER T1 
BEFORE DELETE ON Clients 
FOR EACH ROW
BEGIN
    SELECT Client, Ref FROM Clients K, Invoice F
    IF F.Client = K.Ref
     CALL cannot_delete_error 
END IF;
END

2 个答案:

答案 0 :(得分:3)

使用'INSTEAD OF DELETE'触发器。

基本上,您可以评估是否应该删除该项目。在触发器中,您最终可以决定删除项目,如:

--test to see if you actually should delete it.


--if you do decide to delete it
DELETE FROM MyTable
WHERE ID IN (SELECT ID FROM deleted)

另一方面,请记住,'已删除'表可能包含多行。

另一方面,如果可能的话,尝试在数据库之外执行此操作!或者使用前面的查询。触发器非常难以维护。一个简单的查询或函数(例如dbo.udf_CanIDeleteThis()')可以更加通用。

答案 1 :(得分:0)

如果您使用的是MySQL 5.5或更高版本,则可以使用SIGNAL

DELIMITER //
CREATE TRIGGER tg_fk_check
BEFORE DELETE ON clients
FOR EACH ROW
BEGIN  
  IF EXISTS(SELECT *
              FROM invoices
             WHERE client_id = OLD.client_id) THEN
    SIGNAL sqlstate '45000' 
      SET message_text = 'Cannot delete a parent row: child rows exist';
  END IF;
END//
DELIMITER ;

这是 SQLFiddle 演示。 取消注释上次删除,然后点击Build Schema以查看其效果。