1

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

这两个表是:

ActivityDetails (Primary table)
    ActivityDetailkey (Primary key)

SubActivities (Child table)
    ActivityDetailKey (Refers to ActivityDetails)

现在,SubActivities对于ActivityDetailKey. 基本上,对于每一ActivityDetail行,可以有很多SubActivities行,并且没有什么可以阻止用户删除ActivityDetails一行并留下SubActivities孤立的行。

应用程序中应该有一些“软锁”可以防止这种情况发生,但它不起作用,我也想在 DB 层中提供更好的完整性。

但我似乎无法添加外键,因为SubActivities'ActivityDetailKey列不是唯一的。

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

谢谢

编辑

我为复杂性道歉。该SubActivities表实际上名为TEDetailSubActivities. 我在问题中更改了它,以便更容易阅读。

但无论如何,这里是两个表的完整架构的要点。

https://gist.github.com/840479

我很感激任何帮助。

4

2 回答 2

2

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

ALTER TABLE TEDetailSubActivities ADD CONSTRAINT FK_TEDetailSubActivities_ActivityDetails FOREIGN KEY
      (ActivityDetailKey) references dbo.ActivityDetails (ActivityDetailKey)

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

ALTER TABLE SubActivities ADD CONSTRAINT FK_SubActivities_ActivityDetails FOREIGN KEY
      (ActivityDetailKey) references ActivityDetails (ActivityDetailKey)

SubActivity 中的 ActivityDetailKey 列没有唯一性要求。

照原样,如果 SubActivity 中有引用它们的行,那将停止从 ActivityDetails 中删除行。另一方面,如果您希望应用程序能够继续删除,但避免在 SubActivities 中留下孤立的行,ON DELETE CASCADE请在上面的最后一个右括号之后添加。


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

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

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

  • 右键单击子活动,选择“设计”。
  • 按“关系”工具栏按钮
  • 按“添加”
  • 对“表和列规范”属性按“...”
  • 在“主键表”下拉列表中,选择“ActivityDetails”
  • 在下面的网格中,两边选择ActivityDetailKey
  • 按“确定”、“关闭”、“保存”工具栏按钮和(如有必要)“是”来保存警告
  • 关闭设计器。
于 2011-02-23T13:30:30.370 回答
2

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

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

希望能帮助到你!

于 2011-02-23T13:30:44.630 回答