Sql 如何跨多个层次应用唯一约束
我有以下布局的表格:Sql 如何跨多个层次应用唯一约束,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我有以下布局的表格: 一个项目可以有许多实体关系 一个实体可以有许多数据点关系 如何强制每个项目的DataPoint表的Name列必须是唯一的 目前,我在项目的实体中有一个外键,在该实体的数据点中有另一个外键。我考虑在DataPoint表中添加ProjectId作为另一个外键列,以便使用DataPoint.ProjectId、DataPoint.Name创建一个唯一的约束,但这将带来一个新问题,即无法保证DataPoint.EntityId实际上是DataPoint.ProjectId的子项
- 一个
可以有许多项目
关系实体
- 一个
可以有许多实体
关系数据点
DataPoint
表的Name
列必须是唯一的
目前,我在项目的
实体
中有一个外键,在该实体的数据点
中有另一个外键。我考虑在DataPoint
表中添加ProjectId作为另一个外键列,以便使用DataPoint.ProjectId、DataPoint.Name
创建一个唯一的约束,但这将带来一个新问题,即无法保证DataPoint.EntityId实际上是DataPoint.ProjectId的子项。您希望防止指向同一项目的两个实体具有相同的数据点。SQL约束并不直接支持这一点,这意味着触发器是一种解决方案
如果您可能会产生一些额外的开销,那么您可以有效地做同样的事情:在数据点中包含projectid
。然后包括以下约束:
constraint foreign key (projectid, entityid) refers to entities(projectid, entityid);
constraint unique (projectid, name);
第一个约束是冗余的(projectid
不需要),但它没有什么害处。最大的问题是,您需要在数据点中包含项目ID
,并记住插入它。您希望防止指向同一项目的两个实体具有相同的数据点。SQL约束并不直接支持这一点,这意味着触发器是一种解决方案
如果您可能会产生一些额外的开销,那么您可以有效地做同样的事情:在数据点中包含projectid
。然后包括以下约束:
constraint foreign key (projectid, entityid) refers to entities(projectid, entityid);
constraint unique (projectid, name);
第一个约束是冗余的(projectid
不需要),但它没有什么害处。最大的问题是,您需要在datapoint
中包含projectid
,并记住插入它。我认为您的数据库中不需要这样的层次结构约束,我可以说,需要这样的conatraints意味着糟糕的应用程序逻辑。@TimBiegeleisen,我希望您没有删除您的答案。这让我想到,难道我不能从DataPoint
到Entity
使用ProjectId和EntityId创建一个复合外键吗?这将允许唯一约束,并保证项目/实体对是有效的,不是吗?这太过分了:-(…希望其他人会回答。我认为您的数据库中不需要这样的层次结构约束,而且我可以说,需要这样的conatraints意味着应用程序逻辑不好。@TimBiegeleisen,我希望您没有删除您的答案。这让我想,我不能从 DataPoint
到实体
?这将允许唯一约束,并保证项目/实体对有效,不是吗?这太过分了:-(…希望其他人会回答。谢谢。你知道复合外键是否需要引用复合主键吗?我想我在某个地方读到,复合外键需要父表中的复合PK或UC。你能确认吗?谢谢。你知道复合外键是否需要引用复合主键吗y键?我想我在某个地方读到复合外键需要父表中的复合PK或UC。您能确认吗?