19 sql sql-server sql-server-2012
我有与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
Run Code Online (Sandbox Code Playgroud)
我想要的是,如果孩子中存在对该父项的引用,SQL Server会阻止我删除父项吗?例如,如果存在SubjectId为3的子级,我希望删除SubjectID = 3中的SubjectID = 3.
为此,我不清楚,似乎无法找到答案.我是否需要添加"DELETE NO ACTION"或者我可以不删除这三个单词.
我问这个问题就像在一个类似的问题中我得到了一个响应,我应该在父母上定义一个触发器.但是我认为只要定义外键就会阻止我删除父项(如果存在子项).
Dav*_*haw 32
从MSDN上的column_constraint页面:
ON DELETE {NO ACTION | CASCADE | SET NULL | 默认设置 }
指定更改的表中的行发生的操作,如果这些行具有引用关系并且从父表中删除引用的行.默认值为NO ACTION.
所以,ON DELETE NO ACTION如果你愿意,你可以忽略它,它会起作用.
NO ACTION表示从Subject表中删除Topic表时不会发生任何事情.在这种情况下,如果给定SubjectId的主题中有一行,则无法在不破坏参照完整性的情况下从中删除,因此将回滚删除.
更多来自MSDN:
无操作 - SQL Server数据库引擎引发错误,并回滚父表中行的删除操作.
我将向您建议,虽然您可以跳过 on delete no 操作,但这样做可能不符合您的最佳利益。在表定义中指定这一点可能会阻止某人稍后添加级联删除,因为他们看到您打算不要发生这种情况。当您正确编写所有数据库对象的脚本并将它们置于源代码控制中时,尤其如此,代码审查员会发现存在差异并询问为什么会发生这种情况。很多时候,人们太急于添加删除级联并销毁本应保留的数据(例如不再有效的客户的财务记录)。他们这样做是因为他们得到了不允许他们删除的错误,只是想摆脱它,而不是意识到这使他们免于犯大错。至少如果你的表脚本中有删除无操作的代码,未来的维护者会发现这是故意的,而不仅仅是你忘记设置级联删除。当然,如果您的 dba 不允许级联删除(许多人不允许级联删除并且有充分的理由!)那么这不是一个潜在的问题,但是指定您的意图对于可维护性来说通常是一件好事。
| 归档时间: |
|
| 查看次数: |
52805 次 |
| 最近记录: |