我有一张名为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强制执行此约束?
答案 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约束完全执行。