ON DELETE CASCADE替代方案和性能(SQL Server)

时间:2013-06-14 09:01:58

标签: sql sql-server

在我的程序中,我将条目存储在表格中,条目也可能包含子项目。

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语句中指定一个附加条件来执行相同的操作:

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

问题是父列未编入索引。此列还有许多重复值(NULL),据我所知,与索引一起使用时,重复值非常糟糕。我想知道,这个问题的最佳解决方案是什么

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

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

0 个答案:

没有答案