【问题标题】:If I delete a record from a table it is deleted at many other places如果我从表中删除一条记录,它会在许多其他地方被删除
【发布时间】:2023-03-26 16:07:02
【问题描述】:

我正在研究由前一个团队构建的数据库。我必须从表中删除某些记录(示例如下所示)。

DELETE FROM table WHERE id = 5541

在执行此过程时,其他表中具有相同 ID 的一些记录将被删除。有人可以帮助解决这个问题吗?

【问题讨论】:

  • 可能是预期的行为。 (ON DELETE CASCADE 外键。)
  • 这能回答你的问题吗? remove ON DELETE CASCADE
  • @Mystogan 引用的问题是关于 MySQL 的,这个问题是关于 SQL 服务器的。此外,这是一个非常危险的建议,因为它肯定会导致数据不一致,除非一个人真的知道他在做什么(对于 OP——没有冒犯——似乎并非如此)
  • @Mystogan 我强烈建议不要禁用外键。这会导致数据不一致,并使您的数据库中的数据损坏。

标签: sql sql-server sql-server-2012


【解决方案1】:

在 SQL Server 中,有一个名为 ON DELETE CASCADE 的语句,如果从父表中删除记录,则从子表中删除该记录。这可以使用ALTER STATEMENT 进行设置,如下所示。要删除级联,请尝试将子表更改回默认值。默认为NO CASCADING

ALTER TABLE ChildTable
ADD CONSTRAINT FKey
    FOREIGN KEY (col1, col2, ... coln)
    REFERENCES ParentTable (Pcol1, Pcol2, ... Pcoln)
    ON DELETE CASCADE

还有UPDATE CASCADE,如果父表更新时子表中的数据也要更新。

【讨论】:

  • 这显示了如何添加 ON DELETE CASCADE;不是如何删除它。
  • @PeterB 添加了一条注释来解决这个问题。
  • @Madhukar 。 . . ON DELETE CASCADE 并非特定于 SQL Server。它是标准 SQL 的一部分。
【解决方案2】:

您的数据库肯定包含带有级联删除的外键约束@​​987654321@。

您也许可以删除这些外键,但当然,删除某些行会留下不一致的数据。

另一种可能性是只删除级联删除。但是当然,您将无法删除其他表中的记录引用的任何行,因为 SQL Server 将确保您的数据的一致性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2022-01-16
    • 2022-06-30
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多