2012-09-29 17 views

Odpowiedz

264

nie należy usuwać, używać skróconego:

Truncate table XXX 

tabela obsługi nie pamięta ostatnio używany wartość AUTO_INCREMENT, ale rozpoczyna odliczanie od początku. Dotyczy to również MyISAM i InnoDB, które zwykle nie wykorzystują ponownie wartości sekwencji.

Source.

+19

Funkcja przycinania działa dobrze w przypadku nieskrępowanych tabel, ale jeśli tabela zawiera ograniczenie klucza obcego, można rozważyć użycie metody usuwania. Zobacz ten post, jeśli masz ograniczenia FK: [skracaj tabelę z ograniczonym kluczem obcym] (http://stackoverflow.com/questions/5452760/truncate-foreign-key-constrained-table) –

+1

pamiętaj, że skrócona tabela nie będzie wycofywać –

67

Jeśli nie można używać TRUNCATE (np z powodu ograniczeń kluczy obcych) można użyć alter table po usunięciu wszystkich wierszy, aby ponownie uruchomić AUTO_INCREMENT:

ALTER TABLE mytable AUTO_INCREMENT = 1 
+1

To nie działa dla mnie. Jaki mógł być powód? –

+3

@NBhargav Ponieważ możesz używać silnika InnoDB na stole zamiast MyISAM, pierwszy nie obsługuje resetowania indeksu. –

+0

jak usunąć wszystkie wiersze przed zmianą wartości auto_increment –

6

Interesującym faktem.

byłem pewien TRUNCATE zawsze będzie lepiej, ale w moim przypadku, na bazie danych z około 30 tabel z kluczy obcych, zaludnionych tylko kilka wierszy, zajęło to około 12 sekund TRUNCATE wszystkich tabel, w przeciwieństwie do tylko kilkaset milisekund do DELETE wierszy. Ustawienie automatycznego przyrostu dodaje około sekundy, ale wciąż jest o wiele lepiej.

Proponuję więc spróbować obu, zobacz, który działa szybciej w twoim przypadku.

13

Jeśli tabela ma kluczy obcych następnie Zawsze używam następujący kod:

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check 
SET AUTOCOMMIT = 0; -- disable autocommit 
START TRANSACTION; -- begin transaction 

/* 
DELETE FROM table_name; 
ALTER TABLE table_name AUTO_INCREMENT = 1; 
-- or 
TRUNCATE table_name; 
-- or 
DROP TABLE table_name; 
CREATE TABLE table_name (...); 
*/ 

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check 
COMMIT; -- make a commit 
SET AUTOCOMMIT = 1 ; 

Ale różnica będzie w czasie wykonywania. Spójrz na odpowiedź Sorina.

+1

Jest to dobry sposób na to, aby mieć osierocone dane w dowolnej tabeli, które obce klucze do tabeli, którą wymazujesz. Włączenie sprawdzania klucza obcego po fakcie nie powoduje, że MySQL ponownie potwierdza te klucze obce, o ile wiem. Pozostawia to wiersze zawierające dane, które * nie istnieje * w tabeli odniesienia. Równie dobrze możesz nie mieć * kluczy obcych na swoim stole. – cimmanon

Powiązane problemy