2008-10-30 15 views
51

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 des ID de clé primaire, mais il a fait tout l'incrémentation manuellement, dans le code. Puis-je les transformer en Auto_incrementers maintenant?faire un ID dans une table mysql auto_increment (après le fait)


Wow, très bien, merci beaucoup. Cela a fonctionné 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'

Répondre

96

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 de redéfinir avec l'option AUTO_INCREMENT:

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

Vérifier ce qui 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 la colonne en place, sans nécessiter la création d'une deuxième colonne et laissant tomber la colonne d'origine. La contrainte PRIMARY KEY n'est pas affectée et vous n'avez pas besoin de l'indiquer 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; 

Sorties:

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

Je l'ai testé ceci sur MySQL 5.0.51 sous Mac OS X.

I é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 ça marcherait. Voici quelques liens qui peuvent aider à diagnostiquer le problème:

+0

Wow, très bien, merci beaucoup. Cela a fonctionné sans accroc sur l'une de mes tables. Mais une deuxième table, je reçois cette erreur ... Erreur lors du renommage de '. \ DBNAME \ # sql-6c8_62259c' en '. \ DBNAME \ dealer_master_events' (code d'erreur: 150) –

+1

merci aloat. tu m'as sauvé. merci –

+0

si la clé primaire agit déjà comme une clé étrangère ailleurs, vous devrez désactiver les contrôles de clé étrangère avant d'exécuter la requête alter table. 'set foreign_key_checks = 0; ALTER TABLE acheteur MODIFY COLUMN _id INT NON NULL AUTO_INCREMENT; set foreign_key_checks = 1; ' –

-1

Tant que vous avez des entiers uniques (ou certains uniques valeur) dans le PK actuel, vous pouvez créer une nouvelle table et l'insérer avec IDENTITY INSERT ON. Ensuite, déposez l'ancienne table et renommez la nouvelle table.

N'oubliez pas de recréer les index.

+0

Cette option est spécifique à Microsoft SQL Server et n'a aucune pertinence pour MySQL. –

0

Oui, facile. Exécutez simplement 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 qui pourraient déjà exister sur les clés primaires «artificiellement créées».

4

Je suppose que vous n'avez pas besoin de ré-incrémenter les données existantes, alors pourquoi ne pouvez-vous pas exécuter une simple commande ALTER TABLE pour modifier les attributs du 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 base de données MySQL et cela fonctionne, mais je l'ai pas essayé avec un nombre significatif de dossiers. 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 va fonctionner.

4

Aucune de ces travaillé 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. J'ai dû modifier la colonne à AUTO_INCREMENT (MODIFY COLUMN 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT) et définir 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; 
2

Cela a fonctionné pour moi (je voulais faire d'identification primaire et définir incrémentation automatique)

ALTER TABLE table_name CHANGEMENT idid INT PRINCIPAL AUTO_INCREMENT KEY;