Question

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 deuxième table, je reçois cette erreur ... Erreur lors du changement de nom de '. \ DBNAME # sql-6c8_62259c' en '. \ DBNAME \ dealer_master_events'

Était-ce utile?

La solution

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 MODIFIER 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;

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'une insertion génère une nouvelle valeur:

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

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 également testé avec ENGINE = InnoDB et une table dépendante. La modification de la définition de colonne 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. Mes excuses, après l'avoir testé, j'ai pensé que cela fonctionnerait. Voici quelques liens qui peuvent aider à diagnostiquer le problème:

Autres conseils

Aucune de ces réponses ne fonctionnait 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 ( MODIFIER COLONNE 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT ) et définir le germe ( AUTO_INCREMENT = 31544 ) dans la même instruction.

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

Je suppose qu'il n'est pas nécessaire de ré-incrémenter les données existantes. Pourquoi ne pas 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.

Cela a fonctionné pour moi (je voulais que l'identifiant soit primaire et que l'incrémentation automatique soit activée)

ALTER TABLE nom_table CHANGE id id INT PRIMARY KEY AUTO_INCREMENT;

Oui, c'est 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 à préserver les relations de clé étrangère pouvant exister déjà dans la zone de création " créée artificiellement ". clés primaires.

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 cela ne fonctionnera pas 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 par

.
set foreign_key_checks = 0;

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

set foreign_key_checks = 1;

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

N'oubliez pas de recréer les index.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top