2010-08-05 2 views
0

Одна таблица имеет имя «Этапы», каждый этап может иметь детей от 0 до бесконечности. В таблице «Этапы» есть столбец с именем «Родитель». Этот столбец является иностранным ключом для той же таблицы «Этапы».Удаление каскадного дерева в MS SQL Server Express 2005

Как бы сделать каскадное удаление для этого дерева? Я хочу, чтобы при удалении любой строки в этой таблице, автоматически удалять все свои ребенок и своих ребенок ребенок ...

С помощью следующего запроса

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. 

ответ

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 
) 
+0

Как это сделать с помощью MS SQL Enterprise Manager 2005 Express? –

+0

Это работает только для различения таблиц. Когда ссылка на таблицу сама по себе не работает –

+0

@ Evl-ntnt, ее работы для таблиц, которые имеют ссылку на себя. Можете ли вы предоставить информацию о том, что вы сделали, а что точно не работает? –