私は別のテーブルから行を移動するには、次のクエリを使用します。の移動や削除行は
INSERT INTO `new_table` VALUES (SELECT * FROM `old_table` ORDER BY RAND() LIMIT 0,5)
しかし、私は私がそれらを移動後old_table
から行を削除する必要があります。それは上記のものと同様のクエリを使用して可能ですか?
おかげで、
ジョエル
私は別のテーブルから行を移動するには、次のクエリを使用します。の移動や削除行は
INSERT INTO `new_table` VALUES (SELECT * FROM `old_table` ORDER BY RAND() LIMIT 0,5)
しかし、私は私がそれらを移動後old_table
から行を削除する必要があります。それは上記のものと同様のクエリを使用して可能ですか?
おかげで、
ジョエル
選択の余地
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;
またはストアドプロシージャとしてそれをラップし、機能
更新
データのサブセットを挿入する場合、あなたはそれをラップし、あなたがInnoDBテーブルを使用している場合は、DELETE
でINSERT
に従う必要がありますそのアクションがアトミックなトランザクション。
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テーブルを使用している場合は、DELETE
でINSERT
に従う必要があります。
申し訳ありませんが、データのサブセットを使用しています。 ORDER BY RAND()とLIMIT節を使用してこの例を編集しました。どのように私はその場合DELETEを使用できますか? – Joel
は、2つの連続したクエリを使用することに問題はありますか?最初にコピーしてから削除してください。 – Nishant
rand()とLIMITによる質問を編集しました...必要なDELETEクエリを手伝ってくれたらうれしいです。 – Joel