1

この問題は私に本当の頭痛を与えています。

データベースには、「クロージャーテーブル」と呼ばれるデザインを使用してカテゴリの並べ替えを解決する2つのテーブルがあります。最初のテーブルはと呼ばれcategories、もう1つのテーブルはと呼ばれ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 に答える