Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 与问题本身有关的表_Sql Server 2005_Relational - Fatal编程技术网

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-您可能会使用完整性约束和级联删除来实现这一点,但出于某种原因,我总是担心级联删除。触发器做了完全相同的事情,我喜欢它,因为它更明显——有人想知道为什么行从表中消失了,可能不会考虑使用级联删除查找约束,因为它们很少见,而且可能会查找触发器。不过,从功能上来说,你是对的——没有区别。