Sql server 2005 与问题本身有关的表
我已使用此架构定义了表:Sql server 2005 与问题本身有关的表,sql-server-2005,relational,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 CLUS
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和父Id之间的关系来实现这一点(并为删除规则设置级联),但当我在MMS中这样做时,属性中的删除规则或更新规则被禁用
我的问题是:我能做些什么来实现这一点
多谢各位
编辑:
当我写(比如Id=1或4)时,我指的是父记录,而不是子记录,我不是指Id=1或4之类的查询
一些朋友暗示我可以通过delete触发器来完成,但我想我可以通过relationship来完成,你可以通过“delete触发器”来完成,只需使用它来删除具有匹配父项的任何行即可。这与级联删除基本相同
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
也许您必须首先在ParentID列上定义一个索引。您不能对未编入索引的列设置约束。我总是为解决此问题编写脚本,即在应用程序中搜索ID,然后删除其中所有父ID=ID,然后删除父记录。OR子句如何
Delete From TableName
Where ID = 4 OR ParentId = 4
我认为不能在自引用表上进行级联删除。您可能可以通过连接来完成
Delete from codings
inner join codings2 on codings.id = codings2.parentid
where codings.id = myid
注意:未测试。不,亲爱的,只有一个索引,它聚集在主键上。是的,但您必须在parentID列上定义另一个索引,然后才能定义它的关系。谢谢,但我想我可以通过关系,如果没有触发器,就没有办法做到这一点?@Mostafa-您可能会使用完整性约束和级联删除来实现这一点,但出于某种原因,我总是担心级联删除。触发器做了完全相同的事情,我喜欢它,因为它更明显——有人想知道为什么行从表中消失了,可能不会考虑使用级联删除查找约束,因为它们很少见,而且可能会查找触发器。不过,从功能上来说,你是对的——没有区别。