web-dev-qa-db-fra.com

faire un identifiant dans une table mysql auto_increment (après le fait)

J'ai acquis une base de données d'un autre développeur. Il n'a pas utilisé auto_incrementers sur les tables. Ils ont tous un identifiant de clé primaire, mais il a tout incrémenté manuellement, en code.

Puis-je les transformer en Auto_incrementers maintenant?


Wow, très gentil, merci une tonne. Cela a fonctionné sans accroc sur une de mes tables. Mais une seconde table, je reçois cette erreur ... Erreur lors du changement de nom de '.\DBNAME # sql-6c8_62259c' en '.\DBNAME\dealer_master_events'

58
Gene R

Par exemple, voici une table qui a une clé primaire mais 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 le AUTO_INCREMENT option:

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. Le PRIMARY KEY La contrainte n’est pas affectée et vous n'avez pas besoin de la mentionner dans le ALTER TABLE déclaration.

Ensuite, vous pouvez vérifier qu’une insertion 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)

J'ai testé cela sur MySQL 5.0.51 sur Mac OS X.

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


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

106
Bill Karwin

Aucun de ce qui précède n'a fonctionné pour ma table. J'ai une table avec un entier non signé comme clé primaire avec des valeurs allant de 0 à 31543. Actuellement, il y a plus de 19 000 enregistrements. Je devais modifier la colonne en AUTO_INCREMENT (MODIFY COLUMN 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT) et définissez la graine (AUTO_INCREMENT = 31544) dans la même déclaration.

ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544;
5
Michael A. Griffey

J'imagine que vous n'avez pas besoin de ré-incrémenter les données existantes. Pourquoi ne pas simplement exécuter une simple commande ALTER TABLE pour modifier les attributs de la clé?

Quelque chose comme:

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

J'ai testé ce code sur ma propre base de données 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 sur 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.

4
Stephen Walcher

Cela a fonctionné pour moi (je voulais rendre id primaire et régler l'incrémentation automatique)

ALTER TABLE table_name CHANGE idid INT PRIMARY KEY AUTO_INCREMENT;

2
user2280257
ALTER TABLE `foo` MODIFY COLUMN `bar_id` INT NOT NULL AUTO_INCREMENT;

ou

ALTER TABLE `foo` CHANGE `bar_id` `bar_id` INT UNSIGNED NOT NULL AUTO_INCREMENT;

Mais aucun de ceux-ci ne fonctionnera si votre bar_id est une clé étrangère dans une autre table: vous obtiendrez

an error 1068: Multiple primary key defined

Pour résoudre ce problème, désactivez temporairement les vérifications de contrainte de clé étrangère en

set foreign_key_checks = 0;

et après avoir exécuté les instructions ci-dessus, activez-les à nouveau.

set foreign_key_checks = 1;
0
Dima Dz

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 base de données existante, veillez à conserver toutes les relations de clé étrangère pouvant déjà exister sur les clés primaires "créées artificiellement".

0
Alex Weinstein