删除触发器上的错误
问题描述:
此触发器应从父表中删除未从子表中删除的行。错误在下面的图片中。删除触发器上的错误
我的代码尝试:
CREATE TRIGGER ProductDeleted ON Product
for DELETE AS
BEGIN
DELETE FROM OrderItem
WHERE ProductID = (SELECT ProductID FROM DELETED)
END
帮我请
答
您可以通过添加级联删除提示上一个外键约束,如
CREATE TABLE OrderItem
(
ID INT ,
ProductID NOT NULL UNIQUE
CONSTRAINT fk_Products
REFERENCES Products (ID) ON DELETE CASCADE
);
简化它
既然你已经有了一张桌子,你只需要做放弃约束并重新创建一个约束。
ALTER TABLE OrderItem DROP
CONSTRAINT fk_ProductID;
ALTER TABLE OrderItem ADD
CONSTRAINT fk_ProductID
FOREIGN KEY (ID)
REFERENCES Product (ID)
ON DELETE CASCADE;
这意味着什么,就是,任何时候你删除父表(产品)的纪录,从(OrderItem的)子记录将被删除一样,所以你不必使用触发器,除非如果你想做一些录音。
如果你真的坚持使用触发器,那么你可以调整它这样一点点:
ALTER TRIGGER ProductDeleted on Product
INSTEAD OF DELETE AS
BEGIN
SET NOCOUNT ON;
/* First we are deleting referenced columns in OrderItem table */
DELETE FROM OrderItem
where ProductID IN (select deleted.ID /* Columns from product Table */ from deleted)
/* Now we are doing actual delete statement */
DELETE FROM Products where ID IN (select deleted.ID from deleted)
END
但再次,你应该考虑使用CASCADE DELETE,其更易于安装,更容易维护,每个表只能有一个INSTEAD OF触发器,所以如果你需要做更有意义的事情,你将不得不改变这一点,并增加额外的开销。
答
将SET NOCOUNT ON
添加为触发器正文中的第一项(在BEGIN
之后)。
是的我希望触发器自动删除与产品表相关的记录,当我从产品表中删除一行时,请帮我 –
看看是否有帮助 – S4V1N
替换'where ID =(select delete.ID from deleted)'与'在哪里ID IN(从删除选择deleted.ID)'。删除的虚拟表将包含删除多行的DELETE语句的多行。在这种情况下,您编写它的方式会导致一个“子查询包含多于一行...”的错误。 –