【问题标题】:Delete All the records Using FOREIGN KEY Constraints if Main Table Entity is deleted如果删除主表实体,则使用 FOREIGN KEY 约束删除所有记录
【发布时间】:2015-10-29 05:36:00
【问题描述】:

如果主表的实体被删除,如何从多个表中删除记录,因为约束应用于所有表

场景

让我给你一个场景:有一个名为OrganizationTblOrganization 的主表。该组织在名为tblBranch 的分支表中有分支,这些分支在表tblApplication 中有多个应用程序。这些应用程序又被存储在tblUsers 中的多个用户使用。

我想要的是:当我删除一个组织时,与它相关的所有分支、应用程序和用户也必须删除。

如何在 asp.net 网络表单中的按钮单击上应用它?

现在这是我的删除功能,非常简单

Public void Delete(int? id)
{
    var str = ”DELETE FROM tblOrganization WHERE organizationId=”+ id ;
}

我的表格是这样的:

CREATE TABLE tblOrganization
(
    OrganizationId int,
    OrganizationName varchar(255)
); 


CREATE TABLE tblApplication
(
     ApplicationId int,
     OrganizationId int,
     ApplicationName varchar(255)
);

CREATE TABLE tblBranches
(
    BranchId int, 
    OrganizationId int,
    BranchName varchar (255)
);

CREATE TABLE tblUsers
(
    userId int,
    OrganizationId int,
    UserName varchar(255)
);

像这样在所有表上应用约束

ALTER TABLE [dbo].[tblBranchs] WITH CHECK 
    ADD CONSTRAINT [FK_tblBranchs_tblOrganization] 
    FOREIGN KEY([OrganizationId])
    REFERENCES [dbo].[tblOrganization] ([OrganizationId])

【问题讨论】:

  • 我不确定它的相关性,但您是否查看过“ON DELETE CASCADE”?
  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入
  • 让我研究一下
  • 您不能在 ASP.NET 中“应用”它 - 您需要在基础数据库中定义 外键约束 以将 ON DELETE CASCADE 设置为 on
  • @marc_s 亲爱的,这不是问题,我明白了,谢谢你提醒我

标签: sql asp.net webforms


【解决方案1】:

您需要在 tblBranch、tblApplication 和 tblUsers 的约束中添加 ON DELETE CASCADE

ALTER TABLE [dbo].[tblBranchs] WITH CHECK 
    ADD CONSTRAINT [FK_tblBranchs_tblOrganization] 
    FOREIGN KEY([OrganizationId])
    REFERENCES [dbo].[tblOrganization] ([OrganizationId])
    ON DELETE CASCADE

ALTER TABLE [dbo].[tblApplication] WITH CHECK 
    ADD CONSTRAINT [FK_tblApplication_tblBranchs] 
    FOREIGN KEY([BranchId])
    REFERENCES [dbo].[tblBranchs] ([BranchId])
    ON DELETE CASCADE

ALTER TABLE [dbo].[tblUsers] WITH CHECK 
    ADD CONSTRAINT [FK_tblUsers_tblApplication] 
    FOREIGN KEY([ApplicationId])
    REFERENCES [dbo].[tblApplication] ([ApplicationId])
    ON DELETE CASCADE

现在如果你删除一个组织,数据库引擎会自动删除所有相关的子记录:

  • 如果您删除一个组织,则所有来自 tblBranch、tblApplication 和 tblUsers 的相关记录都将被删除。

  • 如果删除一个分支,tblApplication 和 tblUsers 的所有相关记录都会被删除。

  • 如果您删除一个应用程序,所有来自 tblUsers 的相关记录都将被删除。

  • 如果您删除用户,则不会删除其他任何内容。

【讨论】:

  • 我有一个问题,如果有人删除用户,级联删除会起作用吗?因为我不希望它那样工作,所以它应该只在组织被删除时才起作用,正如我在这个中看到的那样,两者都是,所以我该如何限制它
  • 不,它只能以一种方式工作。从父母到孩子,反之亦然。因此,如果您删除用户,则不会删除其他任何内容。有关完整说明,请参阅我的更新答案。
  • 很抱歉再次打扰您!我知道了 比我还有一个问题 让我们说这次不是管理员,它只是一个创建分支的用户,并且该分支有子分支,如果他要在当前情况下删除父分支,我该如何阻止他CASCADE DELETE 的删除过程将发生我希望他只删除没有子分支的分支
  • 这是非常有帮助的问候
【解决方案2】:

您不能在 ASP.NET 中“应用”它 - 这是一个数据库问题,您需要更改外键约束以包含 ON DELETE CASCADE - 类似这样:

ALTER TABLE [dbo].[tblBranchs] WITH CHECK 
    ADD CONSTRAINT [FK_tblBranchs_tblOrganization] 
    FOREIGN KEY([OrganizationId])
    REFERENCES [dbo].[tblOrganization] ([OrganizationId])
        ON DELETE CASCADE

这意味着:如果 tblOrganization 中的一行被删除,该删除也将级联tblBranchs 表中,删除所有引用该组织的行。您可以通过多个外键约束将这些ON DELETE CASCADE 设置向下传递到tblUsers 表。

【讨论】:

  • 然后我如何在 asp.net 中实现它,意思是如何在按钮单击时向它发送调用
  • @user3515453:只需从tblOrganization 中删除行 - SQL Server 会处理其余部分
  • 我有一个问题,如果有人删除用户,级联删除会起作用吗?因为我不希望它那样工作,所以它应该只在组织被删除时才起作用,正如我在这个中看到的那样,两者都是,所以我该如何限制它
  • 不,当用户被删除时它不会启动 - 用户没有使用使用 ON DELETE CASCADE 的 FK 约束来引用它的“从属”条目。使用 FK 约束,您可以构建一个有向图 - 用户引用应用程序并在应用程序被删除时被删除,应用程序引用分支并在其分支被删除时被删除,分支正在引用组织并在其引用的组织被删除时被删除。这是一个单向的事情 - 它不能在相反的方向工作....
  • 很抱歉再次打扰您!我知道了 比我还有一个问题 让我们说这次不是管理员,它只是一个创建分支的用户,并且该分支有子分支,如果他要在当前情况下删除父分支,我该如何阻止他CASCADE DELETE 的删除过程将发生我希望他只删除没有子分支的分支
猜你喜欢
  • 2015-04-29
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2021-05-30
  • 2014-10-05
  • 1970-01-01
  • 2021-02-04
相关资源
最近更新 更多