下表定義:刪除觸發器替代「ON DELETE CASCADE」以避免「多個級聯路徑」?
CREATE TABLE Customers(id INT NOT NULL PRIMARY KEY, name [varchar](50))
CREATE TABLE Orders (id INT NOT NULL PRIMARY KEY,
customer INT FOREIGN KEY
REFERENCES Customers(id) ON DELETE CASCADE)
CREATE TABLE OrderDetails (id INT NOT NULL PRIMARY KEY,
order INT FOREIGN KEY REFERENCES Orders(id) ON DELETE CASCADE,
customer INT FOREIGN KEY REFERENCES Customers(id) ON DELETE CASCADE )
不是在SQL Server可能的,因爲有多個級聯路徑。
我想我們在order
列創建無ON DELETE CASCADE
訂單明細,讓我們看看是否有可能實施參照完整性與含觸發刪除訂單時:
DELETE FROM OrderDetails
FROM Deleted d
INNER JOIN OrderDetails od
ON od.order = d.id
觸發器觸發後Orders中刪除,所以它是不可能的(DELETE語句與REFERENCE約束衝突)。
我相信問題出在模型設計上,從OrderDetails到Customers的引用是一個糟糕的設計。但是,否則可以爲屬於不同客戶的訂單創建OrderDetails。
兩個問題:
- 什麼是最好的模型設計?
- 是否可以使用觸發器?
編輯:我刪除了OrderDetails給客戶的引用,它沒有任何意義。 這解決了所有問題。
我沒有意識到「因爲它」的差異 - 我立即失去了對觸發器的胃口,設計。 – Gerard 2010-06-28 11:29:56