下表定义:
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 中是不可能的,因为有多个级联路径。
我想让我们创建没有ON DELETE CASCADE
on 列的 OrderDetails order
,让我们看看在删除带有触发器的订单时是否可以强制引用完整性:
DELETE FROM OrderDetails
FROM Deleted d
INNER JOIN OrderDetails od
ON od.order = d.id
触发器在 Orders 中删除后触发,因此不可能(DELETE 语句与 REFERENCE 约束冲突)。
我认为问题出在模型设计上,从 OrderDetails 到客户的参考是一个糟糕的设计。但是,否则可以为属于不同客户的订单创建 OrderDetails。
两个问题:
- 什么是最好的模型设计?
- 仍然可以使用触发器吗?
编辑:我从 OrderDetails 中删除了对客户的引用,这没有任何意义。这解决了所有问题。