créer un identifiant dans une table mysql auto_increment (après le fait)

J’ai acquis une firebase database d’un autre développeur. Il n’a pas utilisé auto_incrementers sur les tables. Ils ont tous des identifiants de clé primaire, mais il a fait toutes les incrémentations manuellement, en code.

Puis-je les transformer en Auto_incrementers maintenant?


Wow, très gentil, merci beaucoup. Cela fonctionnait sans accroc sur l’une de mes tables. Mais une seconde table, je reçois cette erreur … Erreur lors du renommage de “. \ DBNAME # sql-6c8_62259c” en “. \ DBNAME \ dealer_master_events”

Par exemple, voici une table qui a une clé primaire mais qui n’est pas AUTO_INCREMENT :

 mysql> CREATE TABLE foo ( id INT NOT NULL, PRIMARY KEY (id) ); mysql> INSERT INTO foo VALUES (1), (2), (5); 

Vous pouvez MODIFY la colonne pour la redéfinir avec l’option AUTO_INCREMENT :

 mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT; 

Vérifiez que cela a pris effet:

 mysql> SHOW CREATE TABLE foo; 

Les sorties:

 CREATE TABLE foo ( `id` INT(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 

Notez que vous avez modifié la définition de colonne en place sans avoir à créer une deuxième colonne et à supprimer la colonne d’origine. La contrainte PRIMARY KEY n’est pas affectée et vous n’avez pas besoin de la mentionner dans l’instruction ALTER TABLE .

Ensuite, vous pouvez tester qu’un insert génère une nouvelle valeur:

 mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax mysql> SELECT * FROM foo; 

Les sorties:

 +----+ | id | +----+ | 1 | | 2 | | 5 | | 6 | +----+ 4 rows in set (0.00 sec) 

Je l’ai testé sur MySQL 5.0.51 sur Mac OS X.

J’ai également testé avec ENGINE=InnoDB et une table dépendante. La modification de la définition de la colonne d’ id n’interrompt pas l’intégrité référentielle.


Pour répondre à l’erreur 150 que vous avez mentionnée dans votre commentaire, il s’agit probablement d’un conflit avec les contraintes de clé étrangère. Toutes mes excuses, après l’avoir testé, j’ai pensé que cela fonctionnerait. Voici quelques liens qui peuvent aider à diagnostiquer le problème:

Je suppose que vous n’avez pas besoin de ré-incrémenter les données existantes, alors pourquoi ne pas exécuter une simple commande ALTER TABLE pour modifier les atsortingbuts de la PK?

Quelque chose comme:

 ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT 

J’ai testé ce code sur ma propre firebase database MySQL et cela fonctionne, mais je ne l’ai pas essayé avec un nombre significatif d’enregistrements. Une fois que vous avez modifié la ligne, vous devez réinitialiser l’incrément à un nombre garanti pour ne pas interférer avec d’autres enregistrements.

 ALTER TABLE `content` auto_increment = MAX(`id`) + 1 

Encore une fois, non testé, mais je crois que cela fonctionnera.

Aucun des éléments ci-dessus n’a fonctionné pour ma table. J’ai une table avec un entier non signé comme clé primaire avec des valeurs comsockets entre 0 et 31543. Actuellement, il existe plus de 19 000 enregistrements. J’ai dû modifier la colonne en AUTO_INCREMENT ( MODIFY COLUMN ‘id’ INTEGER UNSIGNED NOT NULL AUTO_INCREMENT ) et définir la graine ( AUTO_INCREMENT = 31544 ) dans la même instruction.

 ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544; 

Cela a fonctionné pour moi (je voulais faire id primaire et définir l’incrémentation automatique)

ALTER TABLE table_name CHANGE id id INT PRIMARY KEY AUTO_INCREMENT;

Oui, facile Il suffit d’exécuter une requête de définition de données pour mettre à jour les tables, en ajoutant une colonne AUTO_INCREMENT.

Si vous avez une firebase database existante, veillez à préserver les relations de clé étrangère qui pourraient déjà exister sur les clés primaires “créées artificiellement”.

Tant que vous avez des entiers uniques (ou une valeur unique) dans la PK actuelle, vous pouvez créer une nouvelle table et y insérer IDENTITY INSERT ON. Puis déposez l’ancienne table et renommez la nouvelle table.

N’oubliez pas de recréer des index.