2014-01-31 53 views
1

如何停止刪除一行,在另一個表(不帶FK)的情況下觸發PK? CALL cannot_delete_error會停止刪除嗎? 這是迄今爲止我所擁有的。BEFORE DELETE觸發器

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 
+0

'SELECT Client,Ref FROM Clients K,Invoice F' does not look right。 – BevynQ

+0

什麼是你使用的MySQL的確切版本? – peterm

+0

你正在使用哪些DBMS? –

回答

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()')可以更通用。

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即可看到它的實際操作。