Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何跨多个层次应用唯一约束_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

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。您能确认吗?