2011-09-14 86 views
2

我想在一個sql語句中處理以下內容 - 我想將記錄數複製到歸檔表中,並立即刪除現有的主表。MySQL - 將記錄複製到另一個表,並刪除現有的一個

喜歡的東西:

INSERT INTO `table_archive` 
SELECT * FROM `table_main` 
WHERE `id` IN (1, 2, 3, 4) 
REMOVE FROM `table_main` WHERE `id` IN (1, 2, 3, 4) 

這基本上就像從一個表剪切和粘貼記錄到另一個。

很明顯,上面的語句就是我想要實現的 - 任何想法,如果它是可以實現的,它會是什麼樣的sql語句?

+1

這是不可能的只是一個查詢做。 – zerkms

+0

是的 - 這就是我的想法 - 但我可以用一個語句至少插入IN範圍的記錄嗎? – user398341

回答

3

提到你需要使用一些DML命令:

START TRANSACTION; 
INSERT INTO `table_archive` SELECT * FROM `table_main` WHERE `id` IN (1, 2, 3, 4); 
DELETE`table_main` WHERE `id` IN (1, 2, 3, 4); 
COMMIT; 

見:http://dev.mysql.com/doc/refman/5.0/en/commit.html

+0

感謝凱文 - 我認爲這回答了我的問題。 – user398341

1

不,您不能在單個查詢中執行此操作。但是,您可以嘗試在事務中執行此操作,以便將其作爲單個查詢進行處理。一切都成功了,或者根本不會發生。

這假定你的表是InnoDB類型的。 MyISAM不支持事務。

+0

是的 - 他們是MyISAM,因爲他們之間沒有任何關係,因此不需要InnoDB – user398341

+0

然後,您必須將其作爲兩個單獨的查詢來完成,並且希望它們之間沒有任何中斷。 InnoDB不僅適用於外鍵。沒有FK,它工作得很好。能夠使用交易是切換的一大主要好處 - 唯一「丟失」的是全文索引。 –

+0

謝謝馬克 - 不是InnoDB也比MyISAM慢一點?此外,我之前沒有使用過事務 - 它們是否在我與表交互時自動執行,或者是否需要使用某些特定語句觸發它們?而且 - 當我導出數據庫結構時 - 它們是否也導出了,還是需要在導入具有結構的sql後再次定義它們? – user398341

1

根本不可能。做一個單獨的DELETE,並將整個事件包裝在一個事務中(如果您使用的是支持事務的語言,而不是我不確定支持事務的MYSQL控制檯)。

相關問題