此觸發器應從父表中刪除未從子表中刪除的行。錯誤在下面的圖片中。刪除觸發器上的錯誤
我的代碼嘗試:
CREATE TRIGGER ProductDeleted ON Product
for DELETE AS
BEGIN
DELETE FROM OrderItem
WHERE ProductID = (SELECT ProductID FROM DELETED)
END
幫我請
此觸發器應從父表中刪除未從子表中刪除的行。錯誤在下面的圖片中。刪除觸發器上的錯誤
我的代碼嘗試:
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語句的多行。在這種情況下,您編寫它的方式會導致一個「子查詢包含多於一行...」的錯誤。 –