tosh: mySQL: auto_increment setzen

Hallo,

eine Datenbank hat mysteriöserweise bei einigen Tabellen beim Primary-Key das auto_increment Attribut verloren. Wenn ich jetzt über phpmyadmin versuche, den Key wieder auf auto_increment zu setzen, bekomme ich die Fehlermeldung "alter table causes auto_increment resequencing resulting in duplicate entry '1' for key 'primary'".

Mein nächster Versuch war dann

ALTER TABLE t CHANGE COLUMN uid uid INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = (SELECT MAX(uid) +1 FROM t);

Da scheint die SELECT-Abfrage Probleme zu bereiten. Wenn ich diese durch eine Zahl ersetze, funktioniert es. Kann man dieses Problem in mySQL lösen oder muss ich dafür ein externes Script schreiben?

Beste Grüße
Thorsten

  1. Liebe Mitdenker,
    liebe Wissende,
    liebe Neugierige,

    ja!

    Ich habe gerade mal ausprobiert, wie ich das machen würde:
    Das aktuelle Create-Statement der Tabelle besorgen. Das wird sowohl von PMA, als auch von Heidi oder anderen GUIs angeboten. Wenn der Primary Key Autoincrement not null dort fehlt, musst Du ihn hinzufügen.

    Ein Muster könnte so aussehen:

      
    CREATE TABLE `test` (  
    	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,  
    	`update` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  
    	`entry` DATETIME NULL DEFAULT NULL,  
    	`name` VARCHAR(50) NULL DEFAULT NULL COMMENT 'Unique-Spalte',  
    	`remark` CHAR(50) NULL DEFAULT NULL,  
    	`classes` SET('Hotel','Pension','Lodge','Ferienhaus','Ferienwohnung') NULL DEFAULT 'Hotel,Ferienhaus',  
    	`topclass` ENUM('Beherbung','Gastronomie','Werbung','Vier','Fünf') NULL DEFAULT 'Werbung',  
    	`price` DECIMAL(10,2) NULL DEFAULT NULL,  
    	`descript` TEXT NULL,  
    	`grafic` POLYGON NULL DEFAULT NULL,  
    	PRIMARY KEY (`id`),  
    	UNIQUE INDEX `name` (`name`)  
    )  
    COLLATE='utf8_general_ci'  
    ENGINE=MyISAM  
    AUTO_INCREMENT=5  
    ;  
      
    
    

    (Ist meine Spieltabelle...)

    Du legst also eine NEUE Tabelle unter einem anderen Namen an. Die Angabe für Auto_Increment muss ÜBER dem höchsten vorhandenen Wert der alten leigen. Das hast Du ja schon versucht.

    Die Tabelle ist nach dem Anlegen leer.

    Dann importierst Du die Daten der alten Tabelle, die schon UIDs hat, mittels

      
    INSERT INTO table_neu (<FELDLISTE>)  
        SELECT (<FELDLISTE>)  
            from table_alt;  
      
    
    

    in die neue Tabelle. Wichtig ist dabei, dass eine gültige UID mit selected wird. Die Feldlisten müssen also genau übereinstimmen, wenn es ein 1:1-Abbild werden soll.

    Das sollte so klappen.

    Anschließend wird die alte Tabelle gelöscht, die neue umbenannt.
    Rechte der infrage kommenden User nochmals überprüfen, nicht, dass die auch weg sind.
    Fertig :-)

    Spirituelle Grüße
    Euer Robert

    --
    Möge der Forumsgeist wiederbelebt werden!