Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 如果存在引用父实体的子实体,如何停止对该父实体的删除?_Sql_Sql Server - Fatal编程技术网

Sql 如果存在引用父实体的子实体,如何停止对该父实体的删除?

Sql 如果存在引用父实体的子实体,如何停止对该父实体的删除?,sql,sql-server,Sql,Sql Server,我有以下用于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 ID

我有以下用于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 CASCADE

CREATE TABLE SubTopic (
   [SubTopicId] INT IDENTITY (1, 1) NOT NULL,
   [TopicId] INT NOT NULL,
   [Name] NVARCHAR (4000) Not NULL,
   CONSTRAINT [PK_SubTopic] PRIMARY KEY CLUSTERED ([SubTopicId] ASC)
)

ALTER TABLE [SubTopic] WITH CHECK ADD  CONSTRAINT [FK_SubTopicTopic] 
   FOREIGN KEY([TopicId]) REFERENCES [Topic] ([TopicId]) 
   ON DELETE CASCADE
当我尝试运行脚本时,会收到以下消息:

{"Introducing FOREIGN KEY constraint 'FK_TopicSubject' 
on table 'Topic' may cause cycles or multiple cascade paths. 
Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, 
or modify other FOREIGN KEY constraints.\r\nCould not create constraint. 
See previous errors."}

我真正需要的是,当一个人试图删除一个主题时,有一些主题删除失败。如果我既不包括级联删除,也不包括不删除操作,那么就会发生这种情况。如果没有,那么如果有主题,我如何停止删除该主题?

请参考此链接。它给出了这个错误的详细解释,并建议创建一个触发器作为替代。
简短的回答是:如果您不希望级联更新和删除,请使用ON DELETE NO ACTION。同样适用于更新

这是来自的副本(它是SQL Server 2000,但同样的规则仍然适用)

不删除任何操作

指定如果尝试删除具有外键引用的键的行(在其他表中的现有行中),将引发错误并回滚删除

更新时不执行任何操作


指定如果试图更新某行中的键值,而该行的键被其他表中现有行中的外键引用,则会引发错误并回滚更新。

另外,我想补充一点,您会遇到此错误,因为从Subject表中删除某行时,SQL server将从“主题”表(关于“删除级联”)中删除一行,然后尝试从“子主题”表中删除一行。所以在这里你可以看到,系统只是计算级联路径,为了避免任何最坏的情况,它试图避免任何多级级联。谢谢你的解释。如果我没有“ON DELETE CASCADE”,并且在我尝试删除主题时,主题表中仍然有一些内容,那么这是否会导致错误并导致删除失败?我需要“ON DELETE CASCADE”或“ON DELETE NO ACTION”吗我可以不选择吗?您可以选择该选项,但这会导致数据不一致。因此,为了避免任何不一致,您可以定义一个触发器来从子表中删除一行,或者在子表中添加一个额外的位类型列,并在从父表中删除该行时将其设置为0或1,并相应地进行查询。在查看了几个地方后,我仍然不清楚这一点。“在删除时不执行任何操作”和我在该行不包含任何关于删除的内容之间有什么区别吗?