0

在我的程序中,我将条目存储在一个表中,并且一个条目也可能有子项。

id uniqueidentifier not null primary key
parent uniqueidentifier null (another id from the same table or null)
... other columns

在这个表中,只有顶级条目可以有子项,所以循环或递归是不可能的。

如果我删除一个条目,我还想删除子项。不幸的是,无法将 ON DELETE CASCADE 添加到此类表中:

Introducing FOREIGN KEY constraint '...' on table '...' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

但是,我可以在删除语句中指定一个附加条件来执行相同操作:

DELETE FROM mytable WHERE id = @GUID OR parent = @GUID

问题是父列没有被索引。该列也有很多重复值(NULL),据我所知,重复值在与索引一起使用时非常糟糕。我想知道,这个问题的最佳解决方案是什么

  1. 是否有更好的解决方案来删除子项和父项?
  2. 我应该在父列上使用索引吗?如果是,在这种情况下我应该使用什么类型的索引 - 有很多重复值
  3. 不确定,但我建议上述解决方案中的 OR 语句使主键索引无用,SQL Server 只会扫描整个表。

附言

我无法创建另一个表来存储子项目。

4

0 回答 0