2011-01-06 10 views
1

私は別のテーブルから行を移動するには、次のクエリを使用します。の移動や削除行は

INSERT INTO `new_table` VALUES (SELECT * FROM `old_table` ORDER BY RAND() LIMIT 0,5) 

しかし、私は私がそれらを移動後old_tableから行を削除する必要があります。それは上記のものと同様のクエリを使用して可能ですか?

おかげで、

ジョエル

+0

は、2つの連続したクエリを使用することに問題はありますか?最初にコピーしてから削除してください。 – Nishant

+0

rand()とLIMITによる質問を編集しました...必要なDELETEクエリを手伝ってくれたらうれしいです。 – Joel

答えて

1

選択の余地

alter table old_table add column selected int(1) not null default 0; 
update old_table set selected=1 order by rand() limit 5; 
insert into new_table select * from old_table where selected=1; 
delete from old_table where selected=1; 

またはストアドプロシージャとしてそれをラップし、機能

+0

答えをありがとう。 "#INSERT INTO table_new(Name)VALUES(SELECT FROM table_old)"、SQLエラーが発生する: "#1064 - SQL構文にエラーがあります。正しい構文のMySQLサーバーのバージョンは、 '1行目の' SELECT name FROM table_old 'の近くで使用する " – Joel

+0

これにトリミング? 'INSERT INTO table_new(Name)SELECT名FROMテーブル_old;' – ajreal

1

更新

データのサブセットを挿入する場合、あなたはそれをラップし、あなたがInnoDBテーブルを使用している場合は、DELETEINSERTに従う必要がありますそのアクションがアトミックなトランザクション。

ORDER BY RAND()では、削除された行がわからないため、大きな問題が発生します。おそらくターゲット行を格納するための一時テーブルが必要になります。

BEGIN TRANSACTION; 

CREATE TEMPORARY TABLE `target_keys` 
    SELECT `id` FROM `old_table` ORDER BY RAND() LIMIT 0,5; 

INSERT INTO `new_table` VALUES 
    (SELECT * FROM `old_table` WHERE `id` IN (SELECT `id` FROM `target_keys`)); 

DELETE FROM `old_table` WHERE `id` IN (SELECT `id` FROM `target_keys`); 

DROP TABLE `target_keys`; 

COMMIT; 

編集前の回答

あなたの例のようにすべての行を移動している場合は、その理由だけではなくrename the table

RENAME TABLE old_name TO new_name 

それはデータのサブセットである場合は、アクションがアトミックであるように、トランザクションでラップ、あなたはInnoDBテーブルを使用している場合は、DELETEINSERTに従う必要があります。

+0

申し訳ありませんが、データのサブセットを使用しています。 ORDER BY RAND()とLIMIT節を使用してこの例を編集しました。どのように私はその場合DELETEを使用できますか? – Joel

関連する問題