我有一个'MasterDetail'表,其中包含列Id,key,ItemName。我将我的应用程序中使用的所有枚举值保留在此单个表中。例如
我有另一个表说'Order',其中一列为Status,引用此表为StatusEnum值。我希望这个表'Order'仅引用'MasterDetail'表中的值1,2,4但不引用值3,因为它是ScreenEnum值。
我正在使用SQL Server 2016.请有任何想法。
如果我理解正确,您可以使用生成的列来保留项类型信息:
create table MasterDetail (
Id int identity(1, 1) primary key,
Key varchar(255) unique,
ItemName varchar(255),
constraint unq_masterdetail_key_ItemName unique (key, ItemName)
);
create table orders (
OrderId int identity(1, 1) primary key,
Key varchar(255),
. . .
StatusEnum as ('StatusEnum') persisted,
constraint foreign key fk_orders_key_statusenum (key, statusenum) references masterdetail(key, itemname)
);
请注意,MasterDetail
中的唯一约束是多余的。但是,它允许外键关系引用key
/ itemname
对。这是获得类型1,2,4而不是3的需要。
使用此设计,您将需要以下内容来强制执行参照完整性:
或者,可以使用作为MasterDetail值子集的列级别检查约束来限制允许值。
如果要强制引用完整性,我通常会为每个“枚举”建议单独的表。虽然这需要更多的桌子,但设计有点清洁,恕我直言。