1

我已经用这个模式定义了表:

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 中这样做时,属性中的删除规则或更新规则被禁用。

我的问题是:我该怎么做才能做到这一点?

谢谢

编辑:

当我写(如 Id = 1 或 4)时,我指的是父记录,而不是子记录,我不是指像 Id = 1 或 4 这样的查询

一些朋友暗示我可以通过删除触发器来做到这一点,但我想我可以通过关系来做到这一点

4

5 回答 5

1

也许您必须首先在 ParentID 列上定义一个索引。您不能对未编入索引的列施加约束。

于 2010-06-16T13:59:49.237 回答
1

我总是编写脚本来解决这个问题,IE在应用程序中搜索ID,然后删除所有父ID = ID,然后删除父记录。

于 2010-06-16T14:02:04.067 回答
0

您可以使用“DELETE TRIGGER”来完成它 - 只需使用它来删除任何具有匹配父项的行。这与级联删除基本上是一样的。

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
于 2010-06-16T13:57:42.830 回答
0

OR 子句怎么样?

Delete From TableName
Where ID = 4 OR ParentId = 4
于 2010-06-16T14:03:09.633 回答
0

我认为您不能在自引用表上进行级联删除。您可能可以通过加入来做到这一点。

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

注意未测试。

于 2010-06-16T14:09:06.633 回答