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

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


person Hari kanna    schedule 27.05.2010    source источник
comment
Это звучит как ой, я только что удалил момент из базы данных.   -  person UnkwnTech    schedule 27.05.2010
comment
Нужна помощь тоже. Я только что очистил все свои таблицы из-за ошибки в коде   -  person Timothy Nwanwene    schedule 17.07.2017
comment
... с тем же успехом может быть плохим предложением WHERE!   -  person Kevin_Kinsey    schedule 04.04.2018
comment
эта ссылка может помочь percona.com/blog/2012/02/20/   -  person Yu Jiaao    schedule 16.12.2019


Ответы (6)


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

ROLLBACK -- will undo the changes that you have made
person Vimard    schedule 27.05.2010

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

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

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

COMMIT; -- will confirm your changes

Or

ROLLBACK -- will undo your previous changes
person Palantir    schedule 27.05.2010

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

person halfdan    schedule 27.05.2010

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

person adelarsq    schedule 24.08.2011

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

Найдите идентификатор процесса запроса с помощью => show processlist;

Затем => убить идентификатор;

person RINSON KE    schedule 27.05.2010

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

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

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

person meistermuh    schedule 23.10.2017