SQL Server中基于值的外键

问题描述 投票:1回答:2

我有一个'MasterDetail'表,其中包含列Id,key,ItemName。我将我的应用程序中使用的所有枚举值保留在此单个表中。例如

  1. 已关闭,StatusEnum
  2. 正在进行中,StatusEnum
  3. ScreenA,ScreenEnum
  4. 保持,StatusEnum

我有另一个表说'Order',其中一列为Status,引用此表为StatusEnum值。我希望这个表'Order'仅引用'MasterDetail'表中的值1,2,4但不引用值3,因为它是ScreenEnum值。

我正在使用SQL Server 2016.请有任何想法。

sql sql-server
2个回答
2
投票

如果我理解正确,您可以使用生成的列来保留项类型信息:

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的需要。


0
投票

使用此设计,您将需要以下内容来强制执行参照完整性:

  • 将ItemName列添加到相关表
  • 在MasterDetail Key和ItemName上添加复合唯一约束(或使其成为主键)
  • 将复合外键添加到相关表

或者,可以使用作为MasterDetail值子集的列级别检查约束来限制允许值。

如果要强制引用完整性,我通常会为每个“枚举”建议单独的表。虽然这需要更多的桌子,但设计有点清洁,恕我直言。

© www.soinside.com 2019 - 2024. All rights reserved.