簡體   English   中英

BEFORE DELETE觸發器

[英]BEFORE DELETE trigger

如何停止刪除一個具有觸發器的另一個表(沒有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

使用'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)

另一方面,請記住,'已刪除'表可能包含多行。

另一方面,如果可能的話,盡量在db之外做這個! 或者使用前面的查詢。 觸發器非常難以維護。 簡單的查詢或函數(例如dbo.udf_CanIDeleteThis()')可以更加通用。

如果您使用的是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以查看其運行情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM