当前位置: 首页 > 面试题库 >

我需要在外键上指定ON DELETE NO ACTION吗?

终祯
2023-03-14
问题内容

我有以下用于SQL Server 2012的DDL:

CREATE TABLE Subject (
   [SubjectId] INT IDENTITY (1, 1) NOT NULL,
   [Name] NVARCHAR (50) Not NULL,
   CONSTRAINT [PK_Subject] PRIMARY KEY CLUSTERED ([SubjectId] ASC)
)

CREATE TABLE Topic (
   [TopicId] INT IDENTITY (1, 1) NOT NULL,
   [Name] NVARCHAR (50) NOT NULL,
   [SubjectId] INT NOT NULL,
   CONSTRAINT [PK_Topic] PRIMARY KEY CLUSTERED ([TopicId] ASC)
)
ALTER TABLE [Topic] WITH CHECK ADD  CONSTRAINT [FK_TopicSubject] 
   FOREIGN KEY([SubjectId]) REFERENCES [Subject] ([SubjectId]) 
   ON DELETE NO ACTION

如果子级中存在对该父级的引用,我想让SQL Server阻止我删除该父级吗?例如,如果有SubjectId为3的子代,我希望删除SubjectID =
3上的Subject失败。

为此,我不清楚,似乎找不到答案。我需要添加“删除不采取任何行动”还是可以不删除这三个词?

我问这个问题,就像在一个类似的问题中,我有一个响应,我应该在父级上定义一个触发器。但是,我认为仅定义外键将阻止我删除存在子代的父代。


问题答案:

从MSDN上的column_constraint页面:

删除后{无动作| 级联| SET NULL | 默认设置 }

指定如果更改后的表中的行具有引用关系并且从父表中删除了被引用的行,将对这些行执行什么操作。默认值为 NO ACTION

因此,ON DELETE NO ACTION如果您愿意,可以略过而已,它的工作原理相同。

NO
ACTION表示从主题表删除到主题表时什么也不会发生。在这种情况下,如果“主题”中有给定SubjectId的行,则您不能在不破坏参照完整性的情况下将其删除,因此Delete将回滚。

来自MSDN的更多信息:

无操作-SQL Server数据库引擎引发错误,并且对父表中的行的删除操作将回滚。



 类似资料:
  • 问题内容: 好的,假设我们有两个表,和。在评论中,我们有一列,它表示哪个用户键入了该特定评论。为什么我们需要将其指定为外键?如果我们不这样做,它将仍然有效。我们指定主键,因为据我所知,它可以使查询速度更快(我们只需要搜索一行,而当我们没有主键/索引时,则必须遍历所有行)。这只是一种良好的编码习惯吗? 问题答案: 使用外键时,您将获得: 数据的完整性 更快的查询。 用户: 用户ID: 1个 2个 3

  • 我阅读了一些文章,发现:默认情况下,预启用了以下HttpMessageConverters实例: ByteArrayHttpMessageConverter-转换字节数组 StringHttpMessageConverter-转换字符串 ResourceHttpMessageConverter-转换org.springframework.core.io.resource用于任何类型的八位组流 So

  • 问题内容: 因此,如果某些表缺少主键,则innodb的行为可能会导致问题。 因此,对于Hibernate,我正在寻找一个键来指定@ElementCollection表上的主键,并使用Set作为基础数据结构。 我找到了一种在地图上具有主键的方法,但这有点奇怪,因为我不需要地图。 我还找到了与@Embeddable相关的答案,但是我不需要那种复杂性。我在实体中使用Set或Set作为数据结构。 知道如何

  • 问题内容: AFAIK,您无需在onclick中指定协议: 坏 好 今天,我在GoogleAnallytics上注意到他们正在使用它: 这个例子是完全错误的,还是有理由指定除?以外的其他内容? 问题答案: 这里的一些响应声称“javascript:”前缀是“过去的遗留物”,这意味着浏览器有意对它进行了特殊处理,以实现向后兼容。是否有确凿的证据证明是这种情况(有人检查过源代码)吗? 对我来说,它的意

  • 当我单击Maven Build时,我需要在m2e窗口中指定的目标是什么?

  • 我已经探索了很多,我发现在所有活动中,我们需要指定android:导出参数。我已经在清单中的所有活动中添加了参数,但我仍然收到此错误。 清单合并失败:android:需要为显式指定导出