2011-10-26 3 views
1

カテゴリを削除する場合は、最初に関連グループと属性を持つ関連製品をすべて削除します。製品には多くの関係があります。多くのテーブルからデータを削除する適切な方法は何ですか?

このカテゴリを削除するとき、それは対処方法です:

あなたが見ることができます
if (isset($_POST['catid']) && $_POST['catid'] > 0) { 

    $category_id = mysql_real_escape_string($_POST['catid']); 

    $SQL = "SELECT * FROM products WHERE category_id = '$category_id'"; 
    $q_item = mysql_query($SQL); 

    while ($dItem = mysql_fetch_assoc($q_item)) { 
     $itemid = $dItem['id']; 

     $SQL = "SELECT * FROM option_groups WHERE item_id = " . $itemid; 
     $q = mysql_query($SQL); 

     while ($option_group = mysql_fetch_assoc($q)) { 
      $optionGroup = $option_group['id']; 

      $SQL = "SELECT * FROM options WHERE option_group_id = " . $optionGroup; 
      $q = mysql_query($SQL); 
      while ($row = mysql_fetch_assoc($q)) { 
       $option = $row['id']; 
       mysql_query("DELETE FROM options WHERE id = " . $option); 
       mysql_query("DELETE FROM e_groups_options WHERE option_id = " . $option); 
      } 

      mysql_query("DELETE FROM option_groups WHERE item_id = " . $itemid); 
      mysql_query("DELETE FROM products WHERE id = " . $itemid); 
     } 
    } 

    $SQL = "DELETE FROM categories WHERE id = '$category_id'"; 
    mysql_query($SQL); 

} 

、私は多くのDELETEクエリとコードが含まれて使用されているが、少し厄介になり、別の方法で安全がありますか?

ストレージエンジンはMyISAMで、テーブルには100,000を超える行のデータがあります(フィールドはインデックスされています)。

答えて

3

これらのテーブルがforeign keyに関連している場合は、外部キーにON DELETE CASCADEと指定して、カテゴリを削除することができます。これを適用するには、InnoDBに切り替える必要があります。外部キーのdocumentation引用:InnoDB以外のストレージエンジンについて

を、MySQLサーバはCREATE TABLEステートメントでFOREIGN KEY構文を解析し、それを使用するか、または保存しない

カスケード接続を考慮してくださいアクションはトリガを起動しません。

でテーブルをInnoDBに切り替えることができます。 あなたは、例えば、ALTER TABLE文で外部キーを追加することができます。

ALTER TABLE products 
ADD FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE; 

をこの外部キーを使用すると、categoriesDELETE文を発行するたびに、RDBMSにもproductsこのカテゴリを参照して削除します。

+0

私は「FOREIGN KEY」をmysqlで宣言しませんでした。 –

+0

@ user791022 - 大丈夫ですか? :) – halfer

+0

最初の質問は、MyISAMを選択肢として使用しているのか、それともデフォルトであるのかという理由だけですか?必要ならば、テーブルを 'ALTER TABLE table_name ENGINE = InnoDB';でInnoDBに切り替えることができます。その後、カスケード接続で外部キーを作成することができます。 –

1

ここでは、InnoDBのような外部キー制約をサポートするストレージエンジンを使用し、ON DELETE CASCADEを使用してこれを処理させるようにすることをお勧めします。

MyISAMはnot support foreign keysまでです。

1

あなたがしたくないか、InnoDBテーブルにデータベースエンジンを変更できない場合は、あなたが行うことができますがで複数のテーブルの上にジョインを削除します:

DELETE t1, t2, t3 
FROM tabel1 AS t1 
LEFT JOIN table2 AS t2 ON t1.id = t2.pid 
LEFT JOIN table3 AS t3 ON t2.id = t3.pid 
WHERE t1.id = $id 

からすべてのテーブルを結合する方法があれば行を削除したい場合は、このような単一のクエリを実行するようにコードを調整できます。

2

MyISAMを使用しているため、カスケード削除を実行できないため、結合削除を行うだけで済みます。

DELETE table1, table2 FROM table1 LEFT JOIN table2 ON table1.id = table2.t1_id WHERE table1.id = $id 
0

答えはすでに受け入れたが、利益のためにされています:あなたが削除をカスケード接続しませんデータベース上で立ち往生している場合、あなたは、PropelのようORMを使用することができます。私はそれがdbによってネイティブにサポートされていない手動でカスケード削除を行うように設定できると信じています。

関連する問題