2010-05-27 5 views
37

Как я могу отменить последний выполненный запрос mysql?как отменить запрос mysql?

+71

Это звучит как «oops я только что удалил базу данных». – UnkwnTech

+0

Нужна помощь тоже. Я просто опустошил все мои таблицы, вызванные ошибкой в ​​коде –

ответ

25

Если определить тип таблицы как InnoDB, вы можете использовать транзакции (см ссылку ниже). Вам потребуется установить AUTOCOMMIT = 0, и после того, как вы сможете отправить COMMIT или ROLLBACK в конце запрос или сеанс для отправки или отмены транзакции.

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

В принципе: Если вы делаете транзакцию, просто выполняйте откат. В противном случае вы не можете «отменить» запрос MySQL.

+2

MySQL doc о транзакциях: http://dev.mysql.com/doc/refman/5.0/en/commit.html – UnkwnTech

+2

Будем надеяться, что у вас есть журналы и резервные копии ... – Konerak

28

Вы можете сделать это только во время транзакции.

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

Тогда вы можете:

COMMIT; -- will confirm your changes 

Или

ROLLBACK -- will undo your previous changes 
+0

+1 для быстрого кода. – ptpaterson

3

Вы можете остановить запрос, который обрабатывается этим

Найти идентификатор процесса запроса от => показать PROCESSLIST;

Then => kill id;

5

Для некоторых ситуаций, таких как ALTER TABLE, это невозможно с MySQL, даже с транзакциями (1 и 2).

1

в случае, если вам нужно не только отменить свой последний запрос (хотя, на ваш вопрос, на самом деле, это только указывает на это, я знаю), и поэтому, если транзакция может вам не помочь, вам необходимо реализовать обходной путь для этого:

скопируйте исходные данные перед отправкой запроса и запишите его по требованию на основе уникального идентификатора, который должен быть одинаковым в обеих таблицах; ваш список отката (с копиями неизмененных данных) и фактическая таблица (содержащие данные, которые должны быть отменены). для баз данных, имеющих множество таблиц, лучше всего использовать одну «откатную таблицу», содержащую структурированные дампы/копии исходных данных, а затем по одной для каждой фактической таблицы. он будет содержать имя фактической таблицы, уникальный идентификатор строки, а в третьем поле - контент в любом желаемом формате, который будет четко представлять структуру данных и значения (например, XML). на основе первых двух полей этот третий будет разбираться и записываться обратно в фактическую таблицу. четвертое поле с меткой времени поможет очистить этот откат.

так как в SQL-диалектах нет реального отменить, несмотря на «откат» в транзакции (пожалуйста, исправьте меня, если я ошибаюсь - возможно, теперь есть одно), это единственный способ, я думаю, и у вас есть написать код для этого по своему усмотрению.