我用下面的查詢從一個表中移動行到另一個:移動和刪除行
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;
,或者你把它包裝成存儲過程,函數
更新
當插入數據的一個子集,你將需要遵循INSERT
用DELETE
,如果你正使用InnoDB,敷在一個交易,這樣的行動是原子。
隨着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
如果是數據的一個子集,那麼你就需要按照INSERT
用DELETE
,如果你正使用InnoDB,包裝在一個事務,這樣的操作是原子。
對不起,我正在使用數據子集。我用ORDER BY RAND()和LIMIT子句編輯了這個例子。如何在這種情況下使用DELETE? – Joel 2011-01-06 14:06:56
是否有使用兩個連續的查詢,有問題嗎?先複製然後刪除。 – Nishant 2011-01-06 14:04:50
用rand()和LIMIT命令編輯問題...如果您可以幫助我填寫所需的DELETE查詢 – Joel 2011-01-06 14:07:33