与自身问题有关的表

时间:2010-06-16 13:54:27

标签: sql-server-2005 relational

我已使用此架构定义了表:

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这样的查询

有些朋友暗示我可以通过删除触发器来实现,但我想我可以通过关系

来实现

5 个答案:

答案 0 :(得分:1)

可能您必须首先在ParentID列上定义索引。您不能对未编制索引的列设置约束。

答案 1 :(得分:1)

我总是为此解决脚本,IE在应用程序中搜索ID,然后删除所有父ID = ID的位置,然后删除父记录。

答案 2 :(得分: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

答案 3 :(得分:0)

OR条款怎么样?

Delete From TableName
Where ID = 4 OR ParentId = 4

答案 4 :(得分:0)

我认为您不能在自引用表上进行级联删除。你可以用连接来做。

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

注意未经测试。