我已使用此架构定义了表:
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这样的查询
有些朋友暗示我可以通过删除触发器来实现,但我想我可以通过关系
来实现答案 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
注意未经测试。