【问题标题】:Cascade tree deleting in MS SQL Server Express 2005MS SQL Server Express 2005 中的级联树删除
【发布时间】:2011-03-25 21:19:26
【问题描述】:

一个表名为“Stages”,每个 Stage 可以有 0 到无穷大的孩子。在“Stages”表中有一个名为“Parent”的列。此列是同一个表“Stages”的外键。

如何对这棵树进行级联删除?我想在删除此表中的任何行时,自动删除他们所有的孩子和他们孩子的孩子......

使用以下查询

GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Stage_Stage]') AND parent_object_id = OBJECT_ID(N'[dbo].[Stage]'))
ALTER TABLE [dbo].[Stage]  WITH CHECK ADD  CONSTRAINT [FK_Stage_Stage] FOREIGN KEY([parent])
REFERENCES [dbo].[Stage] ([id]) ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Stage] CHECK CONSTRAINT [FK_Stage_Stage]
GO

我收到此错误

Msg 1785, Level 16, State 0, Line 2
Introducing FOREIGN KEY constraint 'FK_Stage_Stage' on table 'Stage' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Msg 1750, Level 16, State 0, Line 2
Could not create constraint. See previous errors.
Msg 4917, Level 16, State 0, Line 1
Constraint 'FK_Stage_Stage' does not exist.
Msg 4916, Level 16, State 0, Line 1
Could not enable or disable the constraint. See previous errors.

【问题讨论】:

    标签: sql-server cascade delete-row sql-server-2005-express


    【解决方案1】:

    为所有“子”表添加带有 ON DELETE CASCADE 选项的外键。

    ALTER TABLE SomeChildTable 
    CONSTRAINT YOurConstraintName 
    FOREIGN KEY (YourParentId)
    REFERENCES YourParentTable(ParentTableId) ON DELETE CASCADE;
    

    对于新表:

    CREATE TABLE ttt
    (
      ...
      CONSTRAINT YOurConstraintName 
      FOREIGN KEY (YourParentId)
      REFERENCES YourParentTable(ParentTableId) ON DELETE CASCADE
    )
    

    【讨论】:

    • 这仅适用于区分表。当表本身链接时,这不起作用
    • @Evl-ntnt,它适用于具有自身链接的表。您能否提供信息,您做了什么,究竟什么是行不通的?
    • 我读到明天在 sql.ru 上不起作用我会再试一次并给你发消息thanx
    • Я наверное непонятно написал на английском。 Вобщем в моей БД есть таблица в которой хранятся этапы разработки。 Логическиодинэтапможетразбиватьсянадругиеэтапы,вБДэтореализованоспомощьюполя “родитель” - котороессылаетсянадругуюзаписьвэтойтаблице。 Таквот. Хочучтобыприудаленииоднойзаписиудалялисьвсезаписиукоторыхвполеродитель - удаляемаязапись(логически - удаляютсяпотомкиудаляемойзаписи)。 Прочитал что одном форуме что каскадное удаление действует только на разные таблицы。 Вот тут прочитал sql.ru/Forum/actualthread.aspx?bid=6&tid=630450&hl=
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多