2010-05-27 17 views
37

Jak mogę cofnąć ostatnio wykonaną kwerendę mysql?jak cofnąć zapytanie mysql?

+71

To brzmi jak "moment usunięcia właśnie bazy danych". – UnkwnTech

+0

Potrzebujesz pomocy. Właśnie opróżniłem wszystkie moje tabele spowodowane błędem z kodu –

Odpowiedz

25

Jeśli zdefiniujemy typ stołu, InnoDB, można użyć transakcji (patrz link poniżej). Musisz będzie wymagać ustawienia AUTOCOMMIT = 0, i po wydaniu polecenia COMMIT lub ROLLBACK na końcu zapytania lub sesji, aby przesłać lub anulować transakcję.

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

Zasadniczo: Jeśli wykonujesz transakcję, po prostu cofnij. W przeciwnym razie nie można "cofnąć" zapytania MySQL.

+2

Dokument MySQL o transakcjach: http://dev.mysql.com/doc/refman/5.0/en/commit.html – UnkwnTech

+2

Miejmy nadzieję, że masz dzienniki i kopie zapasowe ... – Konerak

28

Możesz to zrobić tylko podczas transakcji.

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

Następnie można:

COMMIT; -- will confirm your changes 

Albo

ROLLBACK -- will undo your previous changes 
+0

+1 dla próbki szybkiego kodu. – ptpaterson

3

można zatrzymać kwerendę, która jest przetwarzany przez ten

znaleźć identyfikator procesu zapytania o => pokaż processlist;

Następnie => zabij id;

5

W przypadku niektórych aplikacji, takich jak ALTER TABLE, nie jest to możliwe z MySQL, nawet z transakcjami (1 i 2).

1

w przypadku, gdy nie tylko trzeba cofnąć swoje ostatnie zapytanie (chociaż pytanie faktycznie wskazuje tylko na to, wiem), a zatem jeśli transakcja może nie pomóc, należy wdrożyć obejście tego problemu:

skopiuj oryginalne dane przed zatwierdzeniem zapytania i zapisz je na żądanie na podstawie unikalnego identyfikatora, który musi być taki sam w obu tabelach; twój stół wycofania (z kopiami niezmienionych danych) i twoja rzeczywista tabela (zawierająca dane, które powinny być "cofnięte" niż). dla baz danych posiadających wiele tabel, jeden pojedynczy "rollback-table" zawierający ustrukturyzowane zrzuty/kopie oryginalnych danych byłby lepszym rozwiązaniem niż jeden dla każdej rzeczywistej tabeli. zawierałaby nazwę rzeczywistej tabeli, unikalny identyfikator wiersza, aw trzecim polu zawartość w dowolnym pożądanym formacie, który wyraźnie reprezentuje strukturę danych i wartości (np. XML). na podstawie dwóch pierwszych pól ta trzecia zostanie przeanalizowana i zapisana z powrotem do rzeczywistej tabeli. czwarte pole ze znacznikiem czasu pomogłoby w wyczyszczeniu tego tabeli wycofywania zmian.

ponieważ nie ma prawdziwego cofnięcia w dialektach SQL pomimo "wycofania" w transakcji (proszę poprawić mnie, jeśli się mylę - może tam jest teraz), to jest jedyny sposób, jak sądzę, i masz napisać kod na własną rękę.