Ich muss alle Zeilen aus einer Tabelle löschen, aber wenn ich eine neue Zeile hinzufüge, möchte ich, dass die Primärschlüssel-ID, die ein automatisches Inkrement aufweist, erneut von 0 bzw. 1 beginnt.
Ich muss alle Zeilen aus einer Tabelle löschen, aber wenn ich eine neue Zeile hinzufüge, möchte ich, dass die Primärschlüssel-ID, die ein automatisches Inkrement aufweist, erneut von 0 bzw. 1 beginnt.
Antworten:
Nicht löschen, abschneiden:
Truncate table XXX
Der Tabellenhandler merkt sich nicht den zuletzt verwendeten AUTO_INCREMENT-Wert, sondern beginnt von vorne zu zählen. Dies gilt auch für MyISAM und InnoDB, die normalerweise keine Sequenzwerte wiederverwenden.
Quelle .
Wenn Sie nicht verwenden können TRUNCATE
(z. B. aufgrund von Fremdschlüsseleinschränkungen), können Sie nach dem Löschen aller Zeilen eine Änderungstabelle verwenden, um das auto_increment neu zu starten:
ALTER TABLE mytable AUTO_INCREMENT = 1
DELETE FROM tablename;
(aber das wird nicht gut funktionieren, wenn es FK-Einschränkungen gibt - siehe stackoverflow.com/a/5452798/507761 )
Wenn die Tabelle Fremdschlüssel enthält, verwende ich immer den folgenden Code:
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 ;
Der Unterschied liegt jedoch in der Ausführungszeit. Schau oben auf Sorins Antwort.
Ein interessanter Fakt.
Ich war mir sicher, dass TRUNCATE
die Leistung immer besser sein wird, aber in meinem Fall dauerte es für eine Datenbank mit ungefähr 30 Tabellen mit Fremdschlüsseln, die nur mit wenigen Zeilen gefüllt waren, ungefähr 12 Sekunden für TRUNCATE
alle Tabellen, im Gegensatz zu nur ein paar hundert Millisekunden für DELETE
die Reihen. Durch Einstellen des automatischen Inkrements wird insgesamt etwa eine Sekunde hinzugefügt, aber es ist immer noch viel besser.
Daher würde ich vorschlagen, beide zu versuchen und herauszufinden, welche für Ihren Fall schneller funktioniert.