Таблица, которая имеет отношение к самой проблеме - PullRequest
1 голос
/ 16 июня 2010

Я определил таблицу с этой схемой:

CREATE TABLE [dbo].[Codings]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ParentId] [int] NULL,
    [CodeId] [int] NOT NULL,
    [Title] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,

    CONSTRAINT [PK_Codings] 
       PRIMARY KEY CLUSTERED ([Id] ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

И заполните его такими данными:

Id          ParentId    CodeId      Title
----------- ----------- ----------- ----------
1           NULL        0           Gender
2           1           1           Male
3           1           2           Female
4           NULL        0           Educational Level
5           4           1           BS
6           4           2           MS
7           4           3           PHD

Теперь я ищу решение, чтобы при удалении записи, которая является родительской (например, Id = 1 или 4), автоматически удаляются все дочерние элементы (все записи с ParentId = 1 или 4).

Я предполагал, что смогу сделать это через связь между Id и Parent Id (и установить каскад для правила удаления), но когда я делаю это в MMS, правило удаления или обновление правила в свойствах отключается.

Мой вопрос: что я могу сделать, чтобы достичь этого?

Спасибо

Edit:

Когда я писал (например, Id = 1 или 4), я имел в виду записи, которые являются родительскими, а не дочерними, и я не имею в виду запрос, подобный Id = 1 или 4

Какой-то друг дал понять, что я могу сделать это с помощью триггера удаления, но я предположил, что могу сделать это с помощью отношения

Ответы [ 5 ]

1 голос
/ 16 июня 2010

Возможно, вам сначала нужно определить индекс для столбца ParentID.Вы не можете наложить ограничения на столбцы, которые не проиндексированы.

1 голос
/ 16 июня 2010

Я всегда пишу для решения этой проблемы, IE в приложении ищет идентификатор, затем удаляет, где все родительские идентификаторы = ID, затем удаляет родительскую запись.

0 голосов
/ 16 июня 2010

Я не думаю, что вы можете иметь каскадные удаления на самореференсной таблице. Вы, вероятно, можете сделать это с помощью объединения.

Delete from codings
inner join codings2 on codings.id = codings2.parentid
where codings.id = myid

Примечание не тестировалось.

0 голосов
/ 16 июня 2010

Как насчет предложения ИЛИ?

Delete From TableName
Where ID = 4 OR ParentId = 4
0 голосов
/ 16 июня 2010

Вы можете сделать это с помощью «УДАЛИТЬ ТРИГГЕРА» - просто используйте его, чтобы удалить все строки, которые имеют соответствующих родителей.По сути, это то же самое, что и каскадное удаление.

CREATE TRIGGER t_Codings_delete
            ON Codings
         AFTER DELETE
AS
BEGIN

    DELETE Codings
      FROM Codings c
      JOIN DELETED d -- Virtual table containing rows you just deleted
        ON c.ParentId = d.Id

END
...