2011-01-06 77 views
1

我用下面的查詢從一個表中移動行到另一個:移動和刪除行

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

不過,我需要從old_table刪除行,一旦我移動它們。有可能使用類似的查詢來處理上面的問題嗎?

感謝,

喬爾

+0

是否有使用兩個連續的查詢,有問題嗎?先複製然後刪除。 – Nishant 2011-01-06 14:04:50

+0

用rand()和LIMIT命令編輯問題...如果您可以幫助我填寫所需的DELETE查詢 – Joel 2011-01-06 14:07:33

回答

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; 

,或者你把它包裝成存儲過程,函數

1

更新

當插入數據的一個子集,你將需要遵循INSERTDELETE,如果你正使用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 

如果是數據的一個子集,那麼你就需要按照INSERTDELETE,如果你正使用InnoDB,包裝在一個事務,這樣的操作是原子。

+0

對不起,我正在使用數據子集。我用ORDER BY RAND()和LIMIT子句編輯了這個例子。如何在這種情況下使用DELETE? – Joel 2011-01-06 14:06:56