2010-05-27 118 views
37

如何撤消最近執行的mysql查詢?如何撤消mysql查詢?

+71

這聽起來像一個「哎呀,我剛剛刪除了數據庫」的那一刻。 – UnkwnTech 2010-05-27 06:08:37

+0

也需要幫助。我只是清空了所有我的表,由代碼 – 2017-07-17 10:15:18

回答

25

如果定義表類型InnoDB的,你可以使用交易(見下面的鏈接)。您 將需要設置AUTOCOMMIT = 0,並且您可以在 查詢或會話結束時發出COMMIT或ROLLBACK以提交或取消事務。

ROLLBACK -- will undo the changes that you have made 
17

基本上:如果你正在做一個事務只是做一個回滾。否則,你不能「撤銷」MySQL查詢。

+2

關於交易的MySQL文檔中的錯誤導致:http://dev.mysql.com/doc/refman/5.0/en/commit.html – UnkwnTech 2010-05-27 06:08:17

+2

讓我們希望你有日誌和備份... – Konerak 2010-05-27 07:26:01

28

您只能在交易過程中這樣做。

BEGIN; 
INSERT INTO xxx ...; 
DELETE FROM ...; 

此後,您可以:

COMMIT; -- will confirm your changes 

或者

ROLLBACK -- will undo your previous changes 
+0

用於快速代碼示例的+1。 – ptpaterson 2012-03-12 17:26:10

3

可以停止正在由該

處理的查詢查找查詢過程的Id通過=> SHOW PROCESSLIST;

Then => kill id;

5

對於一些指令,如ALTER TABLE,即使對於事務(12),對於MySQL也是如此。

1

萬一你不僅需要撤消你的最後一個查詢(儘管你的問題實際上只是指出了這一點,我知道),因此如果一個事務可能無法幫助你,你需要爲此實現一個解決方法:

在提交查詢之前複製原始數據,並基於必須在兩個表中相同的唯一標識按要求回寫;你的回滾表(帶有未改變的數據的副本)和你的實際表(包含應該被「取消」的數據)。 對於有許多表的數據庫,包含結構化轉儲/原始數據副本的一個單一「回滾表」將更適合每個實際表使用一個。它將包含實際表的名稱,行的唯一標識,並在第三個字段中包含清晰表示數據結構和值(例如XML)的任何所需格式的內容。基於前兩個字段,第三個字段將被解析並寫回實際表格。帶時間戳的第四個字段將幫助清理此回滾表。

因爲儘管事務中有「回滾」,但SQL方言中沒有真正的撤銷(請糾正我,如果我錯了 - 也許現在有一個),這是唯一的方法,我猜,你有爲你自己編寫代碼。