1

这个问题让我很头疼。

我的数据库中有两个表,借助称为“闭包表”的设计来解决类别排序问题。第一个表被调用categories,另一个被命名categoriesPaths

类别只是一个基于语言的表:

id | name
----------------
0  | Category 1
1  | Category 2

类别路径看起来像这样:

parent | children | level
-----------------------
1     | 1         | 0
1     | 2         | 1
2     | 2         | 0

要删除路径及其最终的子节点,我运行以下查询:($top 是删除将开始的顶级父节点级别)

DELETE d FROM CategoriesPaths children
JOIN CategoriesPaths a USING (children)
WHERE a.parent = $top;

我想要做的是更改查询以删除categories表中的代表性路径。不幸的是,我没有足够的 SQL 知识来做到这一点。我试图在查询之前使用 foreach 循环来解决问题,但这无法删除,因为该categories表被引用了categoriesPaths......话虽如此,我几乎被卡住了。

如果有人想了解更多关于闭包表设计的信息,这里是我从中学习到的幻灯片的参考:http ://www.slideshare.net/billkarwin/sql-antipatterns-strike-back

4

2 回答 2

2

好吧,我会走另一条路。

  1. 使用要删除的所有项目的 id 创建一个临时表
  2. 从临时表中删除 CategoriesPaths
  3. 从临时表中删除类别
  4. 删除临时表。

像这样:

-- not tested
CREATE TABLE tmp_to_delete
AS SELECT children.children
FROM CategoriesPaths children
JOIN CategoriesPaths a USING (children)
WHERE a.parent = $top;

DELETE FROM CategoriesPaths WHERE children IN (SELECT children FROM tmp_to_delete)
DELETE FROM Categories WHERE id IN (SELECT children FROM tmp_to_delete)

DROP TABLE tmp_to_delete
于 2010-06-03T15:54:00.287 回答
1

为什么不使用事务? http://www.firstsql.com/tutor5.htm

于 2010-06-03T15:55:12.827 回答