gpt4 book ai didi

sql - 我是否需要在外键上指定 ON DELETE NO ACTION?

转载 作者:行者123 更新时间:2023-12-02 02:44:57 25 4
gpt4 key购买 nike

我有以下与 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,我希望删除Subject 中的subjectID=3 会失败。

对此我不清楚,似乎无法找到答案。我是否需要添加“DELETE NO ACTION”,或者我可以不删除这三个词吗?

我问这个问题就像在一个类似的问题中一样,我得到的答复是我应该在父级上定义触发器。不过,我认为只要定义外键就可以阻止我删除父级(如果子级存在)。

最佳答案

来自MSDN上的column_constraint页面:

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

Specifies what action happens to rows in the table that is altered, if thoserows have a referential relationship and the referenced row is deletedfrom the parent table. The default is NO ACTION.

因此,如果您愿意,可以省略ON DELETE NO ACTION,它的工作原理是一样的。

NO ACTION 意味着当您从主题表删除到主题表时不会发生任何事情。在这种情况下,如果主题中有给定主题 ID 的行,则无法在不破坏引用完整性的情况下删除该行,因此删除将被回滚。

来自 MSDN 的更多内容:

NO ACTION - The SQL Server Database Engine raises an error and thedelete action on the row in the parent table is rolled back.

关于sql - 我是否需要在外键上指定 ON DELETE NO ACTION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com