2010-08-29 5 views
23

Es wird possbile Set/Reset der AUTO_INCREMENT Wert einer MySQL-Tabelle überAktualisierung AUTO_INCREMENT Wert aller Tabellen in einer MySQL-Datenbank

ALTER TABLE some_table AUTO_INCREMENT = 1000

Jedoch habe ich die AUTO_INCREMENT auf den bestehenden Wert festlegen müssen (beheben MM-Replikation), so etwas wie:

ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1, die nicht wirklich

gut funktioniert, würde Ich mag diese Abfrage für alle Tabellen in einer Datenbank auszuführen. Aber das ist eigentlich nicht sehr wichtig.

Ich konnte keine Möglichkeit finden, mit diesem Problem umzugehen, außer die Abfragen manuell auszuführen. Würden Sie mir bitte etwas vorschlagen oder auf einige Ideen hinweisen?

Dank

+0

Dies ist nicht so gut funktioniert: 'TABLE my_db.customer auto_increment ALTE = (auto_increment FROM information_schema SELECT.Tabellen WHERE table_name = 'customer') ' – pars

+0

Da Sie die M-M-Replikation erwähnt haben: Müssen Sie AUTO_INCREMENT wirklich berühren, damit die Replikation funktioniert? Normalerweise setze ich die Werte für Auto-Inkrement-Inkrement und Auto-Inkrement-Offset in my.cnf. – faxi05

+0

@ faxi05 ja du hast recht. Ich habe auch die gleiche Konfiguration, die in Ordnung war. Um jedoch nach einem Hardwarefehler zwei Datenbanken neu zu synchronisieren, musste ich alles aus einer DB auslagern und in eine andere importieren. Während des Prozesses gab es einige Fehler. Überraschenderweise sind sie weg, ohne dass ich etwas getan habe. – pars

Antwort

36

Verwendung:

ALTER TABLE some_table AUTO_INCREMENT = 0 

... wird den auto_increment Wert zurückgesetzt der nächste Wert auf dem höchsten vorhandenen Wert in der auto_increment Spalte basiert.

Um dies über alle Tabellen auszuführen, müssen Sie MySQL's dynamic SQL syntax called PreparedStatements verwenden, da Sie den Tabellennamen für eine Anweisung ALTER TABLE nicht als Variable angeben können. Sie müssen über die Ausgabe von:

SELECT t.table_name 
    FROM INFORMATION_SCHEMA.TABLES t 
WHERE t.table_schema = 'your_database_name' 

... die ALTER TABLE-Anweisung oben für jede Tabelle ausführen.

+0

'ALTER TABLE some_table AUTO_INCREMENT = 0' funktionierte nicht wie erwartet. Auf der anderen Seite muss ich den Wert auto_increment möglicherweise auch explizit festlegen. Wie es um 9 zu erhöhen. Dieses Ding wird kompliziert. Ich vermute, ich bin in die falsche Richtung. Vielleicht sollte ich einen anderen Weg finden. – pars

+1

@celalo: Ich stimme nicht zu, dass AUTO_INCREMENT = 0 nicht funktioniert - Ich habe es selbst getestet, bevor ich es gepostet habe: Ich habe drei Datensätze hinzugefügt, die auto_increment auf 100 aktualisiert, bevor ich einen vierten Datensatz eingefügt habe. Löschte den Datensatz, dessen ID-Wert 100 war, und führte vor dem Einfügen eines fünften Datensatzes die Anweisung AUTO_INCREMENT = 0 aus. Der Datensatz wurde um eins höher als der vorhandene dritte Datensatz eingefügt. –

+2

Bis einschließlich MySQL 5.5, [Dokumentation] (http://dev.mysql.com/doc/refman/5.5/en/alter-table.html) angegeben: 'Für InnoDB, wenn der Wert kleiner als die aktuelle ist Maximalwert in der Spalte, kein Fehler tritt auf und der aktuelle Sequenzwert wird nicht verändert. "Ab MySQL 5.6, [Dokumentation] (http://dev.mysql.com/doc/refman/5.5/en/alter-table. html) gibt jetzt Folgendes an: 'Wenn sowohl für InnoDB als auch für MyISAM der Wert kleiner oder gleich dem Maximalwert in der Spalte AUTO_INCREMENT ist, wird der Wert auf den aktuellen Wert der maximalen AUTO_INCREMENT-Spalte plus eins zurückgesetzt.' – vladr

1

Angenommen, Sie müssen dies korrigieren, indem Sie die Autoinkrementspalte und nicht die Fremdschlüssel in der Tabelle, die die N: M-Beziehung zerlegt, ändern und die richtigen Werte angeben können, versuchen Sie es mit einer temporären Tabelle Die entsprechende Spalte wird nicht automatisch inkrementiert. Ordnen Sie diese dann an der ursprünglichen Tabelle an und ändern Sie den Spaltentyp anschließend in automatisches Inkrementieren oder kürzen Sie die ursprüngliche Tabelle und laden Sie die Daten aus der temporären Tabelle.

5

In den folgenden Anweisungen müssen Sie alles, was in [Klammern] steht, durch Ihren korrekten Wert ersetzen. BACKUP VOR DEM VERSUCHEN.

Wenn Sie sich einloggen können als root über die Befehlszeile mysql, dann könnten Sie das tun, nach dem auto_increment auf alle Tabellen zurückgesetzt werden, zuerst werden wir unsere Anfragen konstruieren, die wir ausführen möchten:

eine Datenbanksicherung Stellen :

mysqldump -u [uname] -p [dbname] | gzip -9 > [backupfile.sql.gz] 

Anmeldung:

mysql -u root -p 

die group_concat_max_length auf einen höheren Wert, so dass unsere Liste der Abfragen nicht verkürztes Set erhalten:

SET group_concat_max_len=100000; 

unsere Liste der Abfragen erstellen, indem Sie die folgenden ein:

SELECT GROUP_CONCAT(CONCAT("ALTER TABLE ", table_name, " AUTO_INCREMENT = 0") SEPARATOR ";") FROM information_schema.tables WHERE table_schema = "[DATABASENAME]"; 

Dann werden Sie eine lange Reihe von MySQL-Abfragen durch ein Bündel von Bindestrichen gefolgt erhalten. Kopieren Sie die Zeichenfolge von Abfragen in die Zwischenablage, wird es so ähnlich aussehen:

ALTER table1 AUTO_INCREMENT = 0;ALTER table2 AUTO_INCREMENT = 0;...continued... 

Wechseln Sie auf die Datenbank, die Sie möchten, den Befehl auszuführen auf:

USE [DATABASENAME]; 

dann die Zeichenfolge einfügen, die auf ist Ihre Zwischenablage und drücken Sie die Eingabetaste, um sie auszuführen. Dies sollte die Änderung an jeder Tabelle in Ihrer Datenbank ausführen.

Vermisst? Wiederherstellung von der Sicherung, müssen Sie von mysql abzumelden, bevor die folgenden läuft (nur exit; geben, dies zu tun)

gzip -d < [backupfile.sql.gz] | mysql -u [uname] -p [dbname] 

Ich werde nicht die Verantwortung für eventuelle Schäden verursachen nehme durch die Nutzung irgendeiner diese Befehle verwenden zu Ihr eigenes Risiko.

0

ich unten Prozedur geschrieben haben die Datenbanknamen ändern und führen Sie die Prozedur

CREATE DEFINER=`root`@`localhost` PROCEDURE `setAutoIncrement`() 
BEGIN 
DECLARE done int default false; 
    DECLARE table_name CHAR(255); 
DECLARE cur1 cursor for SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t 
     WHERE t.table_schema = "buzzer_verifone"; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    open cur1; 

    myloop: loop 
     fetch cur1 into table_name; 
     if done then 
      leave myloop; 
     end if; 
     set @sql = CONCAT('ALTER TABLE ',table_name, ' AUTO_INCREMENT = 1'); 
     prepare stmt from @sql; 
     execute stmt; 
     drop prepare stmt; 
    end loop; 

    close cur1; 
END 

die Prozedur ausführen unterhalb der Linie oben mit

Call setAutoIncrement(); 
4
set @db = 'your_db_name'; 

SELECT concat('ALTER TABLE ', @db, '.', TABLE_NAME, ' AUTO_INCREMENT = 0;') 
FROM information_schema.TABLES WHERE TABLE_SCHEMA = @db 

Dann copy-paste und führen Sie die Ausgabe, die Sie bekommen.

+1

Das funktioniert wirklich gut und ist sehr einfach zu bedienen. Denken Sie daran: Vergessen Sie nicht, zuerst Ihren_DB_Namen durch Ihren tatsächlichen Datenbanknamen zu ersetzen! –

0

fand ich diesen Kern auf Github und es funktioniert für mich wie ein Zauber: https://gist.github.com/abhinavlal/4571478

Den Befehl:

mysql -Nsr -e "SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t WHERE t.table_schema = 'DB_NAME'" | xargs -I {} mysql DB_NAME -e "ALTER TABLE {} AUTO_INCREMENT = 1;" 

Wenn Ihre DB ein Passwort erforderlich ist, können Sie leider, dass in dem Befehl setzen müssen damit es funktioniert. Ein Workaround (immer noch nicht groß aber funktioniert) ist das Passwort in eine sichere Datei zu stellen. Sie können jederzeit die Datei löschen, nachdem so das Passwort nicht in Ihrem Befehl Geschichte nicht bleiben:

... | xargs -I {} mysql -u root -p`cat /path/to/pw.txt` DB_NAME -e... 
Verwandte Themen