2011-07-20 15 views
0

テーブルからアーカイブテーブルにデータを移動する必要があります。テーブル間を移動する

今、私はそれをこのように実行します。

$sql = 'INSERT INTO history_products 
     SELECT * FROM products WHERE category_id='.$id; 

そして私は、製品テーブルからデータを削除します。

$sql_delete = 'DELETE FROM products WHERE category_id = '.$id; 

各製品には固有のIDがあります。 しかし、これを安全な方法で行いたいのですが、行がhistory_productsに挿入されていなくても、行は商品テーブルから削除されます。挿入が失敗した場合は削除したくありません。

答えて

1

私はあなたの製品は、両方のテーブルで同じIDを持っている必要がありますID(ProduktID)と呼ばれるフィールドを持って、次のように動作するはずです期待。

はproducts.id

+0

私が考えるこの方法:CATEGORY_ID = $ CATEGORY_ID Productsから削除し、(history_productsからhistory_products.id SELECT)ではproducts.id – morandi3

+0

は(history_productsからhistory_products.id SELECT products.category_id = $ CATEGORY_ID製品からのDELETEおよびIn products.id and history_products.category_id = $ category_id)これにより、INのカウントが小さくなり、おそらく実行全体が少し遅くなります – Dukeatcoding

+0

または、この方法は?:DELETE FROM products where products.id IN(SELECT history_products.id FROM history_products WHERE category_id = $ category_id)? – morandi3

1

ユニークキーを使用する場合、履歴テーブルのキーと同じキーを持つ製品からすべてのレコードを削除します。

+0

これは、挿入されたすべての行を取得するために、INSERT後に別のselectを行う必要があることを意味します。 – morandi3

+0

いいえ私は彼が何を意味すると思います.. WHERE節のDELETEの句で同じでなければならない一意の製品IDを使用してください – Dukeatcoding

+1

SELECTは必要ありません。ちょうど削除する。 –

1
DELETE FROM products WHERE category_id IN (SELECT category_id FROM history_products) 

(history_productsからhistory_products.id選択)ではThis'dのみ対応するレコードがhistory_productsに存在する製品テーブル内のレコードを削除した製品から削除します。

+0

これは、移動されなかった同じカテゴリのレコードを削除します。 –

+0

uはまだ全体のカテゴリを削除しています... michのアプローチは、productidを使って、idが履歴テーブル内にある製品を削除します – Dukeatcoding

+0

まあ、category_idは主キーフィールドが両側にあるものに変更します。 –

関連する問題