如何停止删除具有触发器的另一个表(没有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
答案 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
以查看其效果。