FK约束可以在几个表上工作吗?

时间:2011-10-07 22:07:08

标签: sql sql-server sql-server-2008 constraints

我有一张名为Order的表格。它有一个名为OrderSource的表的FK,它在名为SourceId中具有非唯一ID。 Order还有一个名为OrderType的表格的FK(可以订购的目录)。它有一个OrderTypeId的PK。

然后我有另一个表(Order_OrderSource),它限制了我对给定OrderTypeId可以拥有的SourceIds的种类。 (它包含OrderTypeId,SourceId和ClassId行(另一个用于将特定源和OrderType组合在一起的Id)。

我想要的是让数据库强制订单不能拥有OrderSource.SourceId,如果它的OrderTypeId在Order_OrderSource表中不匹配。

这是一种关联表模式。但它崩溃了,因为SourceId不是OrderSource的PK。

我可以通过什么方式让SQL Server强制执行此约束?

2 个答案:

答案 0 :(得分:2)

是的,一列可以是不同表的多个外键约束的一部分。

外键需要您引用的列上的唯一索引(或主键)。在您的情况下,您可以使用Order_OrderSource.(OrderSource,OrderType)上的复合主键来满足此要求。

示例SQL:

create table OrderSource (id int primary key)
create table OrderType (id int primary key)
create table Order_OrderSource (OrderSource int, OrderType int, 
    constraint PK_Order_OrderSource primary key (OrderSource,OrderType))
create table [Order] (
    id int, 
    OrderSource int foreign key references OrderSource(id), 
    OrderType int foreign key references OrderType(id), 
    constraint FK_Order_OrderSource 
        foreign key (OrderSource,OrderType) 
        references Order_OrderSource (OrderSource,OrderType))

(OrderSource, OrderType)的组合现在受Order_OrderSource中的行限制。

答案 1 :(得分:0)

听起来Order_OrderSource定义了OrderType,OrderSource和Class之间的有效关系?订单按OrderType,OrderSource和(可能)类进行分类?

如果是这种情况,为什么不在Order_OrderSource中定义有效组合,并在订单上创建与此表相关的FK?那么您就不需要Order上的SourceId或OrderTypeId,并且您可以通过FK约束完全执行。