SQL Server中基于值的外键

时间:2017-12-23 15:37:29

标签: sql sql-server

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

  1. 已关闭,StatusEnum
  2. 正在进行中,StatusEnum
  3. ScreenA,ScreenEnum
  4. Hold,StatusEnum
  5. 我有另一张桌子说“订购”#39;其中一列为状态,为StatusEnum值引用此表。我想要这张桌子' Order'仅参考MasterDetail'中的值1,2,4。表,但不是值3,因为这是ScreenEnum值。

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

2 个答案:

答案 0 :(得分: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的需要。

答案 1 :(得分:0)

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

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

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

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