这个问题让我很头疼。
我的数据库中有两个表,它们通过名为“Closure表”的设计解决了类别的排序问题。第一个表称为categories
,另一个表名为categoriesPaths
。
类别只是一种基于语言的表格:
id | name
----------------
0 | Category 1
1 | Category 2
CategoriesPaths如下所示:
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
答案 0 :(得分:2)
好吧,我会采取不同的方式。
像这样:
-- 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
答案 1 :(得分:1)
为什么不使用交易? http://www.firstsql.com/tutor5.htm