我正在尝试删除所有用户,但出现错误:
Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_M02ArticlePersons_M06Persons". The conflict occurred in database "workdemo.no", table "dbo.M02ArticlePersons", column 'M06PersonId'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)
查询:
DELETE FROM [workdemo.no].[dbo].[M06Persons]
WHERE ID > '13'
GO
Run Code Online (Sandbox Code Playgroud)
似乎我需要使用,on delete cascade;
但我被卡住了。
Rem*_*anu 20
您不需要使用 on delete 级联。有人(模式设计作者)确保您不能删除仍被文章引用的人。它成功了,你只是想这样做却被阻止了,这是设计师的荣誉。
现在去与设计模式并了解约束的人交谈,并询问他如何以正确的顺序正确删除您要删除的记录并采取适当的预防措施以保持数据库的一致性。
小智 10
您在这里有两个真正的选择,您可以禁用表上的约束。这通常不是一个好主意,因为如果您弄乱了与其他表相关的数据,但不知道架构的全部范围并且它可能适合您的目的,您最终可能会遇到糟糕的数据条件:
ALTER TABLE [workdemo.no].[dbo].[M06Persons] NOCHECK CONSTRAINT [FK_M02ArticlePersons_M06Persons]
Run Code Online (Sandbox Code Playgroud)
记得在删除后重新打开约束
ALTER TABLE [workdemo.no].[dbo].[M06Persons] WITH CHECK CHECK CONSTRAINT [FK_M02ArticlePersons_M06Persons]
Run Code Online (Sandbox Code Playgroud)
第二种选择是使用 ON DELETE CASCADE 选项删除并重新添加约束:
ALTER TABLE [workdemo.no].[dbo].[M06Persons] DROP CONSTRAINT [FK_M02ArticlePersons_M06Persons]
ALTER TABLE [workdemo.no].[dbo].[M06Persons] WITH NOCHECK ADD CONSTRAINT [FK_M02ArticlePersons_M06Persons] FOREIGN KEY(M06PersonId)
REFERENCES <parent table here> (<parent column here>)
ON DELETE CASCADE
Run Code Online (Sandbox Code Playgroud)
根据您的 FK 名称,您的父表是 M02ArticlePersons,父列是 M06Persons。
如果您不是此架构的作者,请尝试考虑为什么会出现这些约束,并了解以这种方式违反它们可能会产生意想不到的副作用。