Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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 server 2005 适用于MS SQL Server 2005且没有唯一约束的正确外键?_Sql Server 2005_Foreign Key Relationship_Referential Integrity - Fatal编程技术网

Sql server 2005 适用于MS SQL Server 2005且没有唯一约束的正确外键?

Sql server 2005 适用于MS SQL Server 2005且没有唯一约束的正确外键?,sql-server-2005,foreign-key-relationship,referential-integrity,Sql Server 2005,Foreign Key Relationship,Referential Integrity,我有两个表(MS SQL Server 2005)和一个现有的应用程序(除了索引等,不允许对数据库进行任何更改) 这两个表格是: ActivityDetails (Primary table) ActivityDetailkey (Primary key) SubActivities (Child table) ActivityDetailKey (Refers to ActivityDetails) 现在,对于ActivityDetailKey,在子活动上没有任何限制。基本

我有两个表(MS SQL Server 2005)和一个现有的应用程序(除了索引等,不允许对数据库进行任何更改)

这两个表格是:

ActivityDetails (Primary table)
    ActivityDetailkey (Primary key)

SubActivities (Child table)
    ActivityDetailKey (Refers to ActivityDetails)
现在,对于
ActivityDetailKey
,在
子活动上没有任何限制。基本上,对于每个
ActivityDetail
行,可以有许多
子活动
行,没有任何东西可以阻止用户删除
ActivityDetails
行并将
子活动
孤立

应用程序中应该有一些“软锁”来防止这种情况,但它不起作用,我也想在DB层中加入一些更好的完整性

但是我似乎无法添加外键,因为
子活动
活动详细信息键
列不是唯一的

如果有孩子在场,我如何防止人们删除
ActivityDetails

谢谢

编辑

我为复杂性道歉。
SubActivities
表实际上被命名为
TEDetailSubActivities
。我把问题改了,以便更容易阅读

但无论如何,这里是两个表的完整模式的要点


谢谢你的帮助

听起来您试图以错误的方式设置外键-如果子活动中有多行具有相同的ActivityDetailKey值,并且这些都是对ActivityDetails中主键的引用,那么以下应该可以工作(基于您发布的架构,现在已测试):

以前的版本,基于post中的表名:

ALTER TABLE SubActivities ADD CONSTRAINT FK_SubActivities_ActivityDetails FOREIGN KEY
      (ActivityDetailKey) references ActivityDetails (ActivityDetailKey)
子活动中的ActivityDetailKey列没有唯一性要求

按原样,如果子活动中存在引用行,则将停止从ActivityDetails中删除行。另一方面,如果您希望应用程序能够继续执行删除操作,但避免在子活动中留下孤立行,请在上面的最后一个结束括号后添加
on DELETE CASCADE


以上工作基于下表定义。如果它在您的数据库中不起作用,您需要帮助我们发布数据库中的实际表定义,或者发布一些“足够接近”的内容,以便我们模仿您看到的内容:

create table ActivityDetails (
    ActivityDetailkey int not null Primary key
)
go
create table SubActivities (
    ActivityDetailKey int not null
)
go

唉。如果您坚持使用SSMS设计器:

  • 右键单击子活动,选择“设计”
  • 按“关系”工具栏按钮
  • 按“添加”
  • 在“表和列规范”属性上按“…”
  • 在“主键表”下拉列表中,选择“活动详细信息”
  • 在下面的网格中,选择两侧的ActivityDetailKey
  • 按“确定”、“关闭”、“保存”工具栏按钮,并(如有必要)按“是”以显示保存警告
  • 关闭设计器

听起来您试图以错误的方式设置外键-如果子活动中有多行具有相同的ActivityDetailKey值,并且这些都是对ActivityDetails中主键的引用,那么以下操作应该有效(基于您发布的架构,现在已测试):

以前的版本,基于post中的表名:

ALTER TABLE SubActivities ADD CONSTRAINT FK_SubActivities_ActivityDetails FOREIGN KEY
      (ActivityDetailKey) references ActivityDetails (ActivityDetailKey)
子活动中的ActivityDetailKey列没有唯一性要求

按原样,如果子活动中存在引用行,则将停止从ActivityDetails中删除行。另一方面,如果您希望应用程序能够继续执行删除操作,但避免在子活动中留下孤立行,请在上面的最后一个结束括号后添加
on DELETE CASCADE


以上工作基于下表定义。如果它在您的数据库中不起作用,您需要帮助我们发布数据库中的实际表定义,或者发布一些“足够接近”的内容,以便我们模仿您看到的内容:

create table ActivityDetails (
    ActivityDetailkey int not null Primary key
)
go
create table SubActivities (
    ActivityDetailKey int not null
)
go

唉。如果您坚持使用SSMS设计器:

  • 右键单击子活动,选择“设计”
  • 按“关系”工具栏按钮
  • 按“添加”
  • 在“表和列规范”属性上按“…”
  • 在“主键表”下拉列表中,选择“活动详细信息”
  • 在下面的网格中,选择两侧的ActivityDetailKey
  • 按“确定”、“关闭”、“保存”工具栏按钮,并(如有必要)按“是”以显示保存警告
  • 关闭设计器

您可以拥有一个外键,即使它在子表上重复,您也应该使用CHECK选项添加约束,例如:

ALTER TABLE [dbo].[SubActivities]  WITH CHECK ADD  CONSTRAINT [FK_SubActivities_ActivityDetails] FOREIGN KEY([ActivityDetailkey])
REFERENCES [dbo].[ActivityDetails ] ([ActivityDetailkey])

希望有帮助

您可以拥有一个外键,即使它在子表上重复,您也应该使用CHECK选项添加约束,例如:

ALTER TABLE [dbo].[SubActivities]  WITH CHECK ADD  CONSTRAINT [FK_SubActivities_ActivityDetails] FOREIGN KEY([ActivityDetailkey])
REFERENCES [dbo].[ActivityDetails ] ([ActivityDetailkey])

希望有帮助

我尝试了这两种方法,得到的结果是:“表子活动中的列与现有主键或唯一约束不匹配。”谢谢各位。请问ActivityDetails的确切架构是什么?我无法在SQL Server 2005中重现您的错误消息-如果ActivityDetails中没有主键,或者是不同的主键,我会收到消息“引用的表“ActivityDetails”中没有匹配的主键或候选键。。。“您的消息似乎是在尝试使用SSMS可视化工具而不是查询创建关系时生成的,您似乎仍然试图以错误的方式设置关系。@cbmeeks-您在TEDetailsSubActivities中的条目与ActivityDetails中的某一行不对应-您需要删除这些孤立行或在ActivityDetails表中为它们插入新的“虚拟”行。我尝试了这两种方法,得到了:“表子活动中的列与现有主键或唯一约束不匹配。”谢谢各位。ActivityDetails的确切架构是什么?我无法重现您的错误