61 votes

rendre un ID dans une table mysql auto_incrémenté (après coup)

J'ai acquis une base de données d'un autre développeur. Il n'utilisait pas d'auto-incrémenteurs sur les tables. Elles ont toutes des ID de clé primaire, mais il faisait toutes les incrémentations manuellement, dans le code.

Puis-je les transformer en Auto_incrémenteurs maintenant ?


Wow, très bien, merci beaucoup. Cela a fonctionné sans problème sur une de mes tables. Mais sur une deuxième table, j'obtiens cette erreur... Error on rename of '. \DBNAME #sql-6c8_62259c' en '. \DBNAME\dealer_master_events '

113voto

Bill Karwin Points 204877

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

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 sur place, sans qu'il soit nécessaire de créer une deuxième colonne et de laisser tomber la colonne d'origine. Le site PRIMARY KEY n'est pas affectée, et il n'est pas nécessaire de le mentionner dans la section ALTER TABLE déclaration.

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é ceci 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 id La définition de la colonne 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é, je pensais que cela fonctionnerait. Voici quelques liens qui peuvent aider à diagnostiquer le problème :

0 votes

Wow, très bien, merci beaucoup. Cela a fonctionné sans problème sur une de mes tables. Mais sur une deuxième table, j'obtiens cette erreur... Error on rename of '. \DBNAME\ #sql-6c8_62259c' en '. \DBNAME\dealer_master_events (errno : 150)

2 votes

Si la clé primaire fait déjà office de clé étrangère ailleurs, vous devrez désactiver la vérification des clés étrangères avant d'exécuter la requête de modification de table. set foreign_key_checks = 0; ALTER TABLE buyer MODIFY COLUMN _id INT NOT NULL AUTO_INCREMENT; set foreign_key_checks = 1;

0 votes

@mugumedavid, ce n'est pas correct. Je viens de l'essayer. Vous pouvez modifier la table parente et rendre sa clé primaire auto_incrémentée même si des tables dépendantes y font référence. De même, dans l'autre sens, si vous voulez ajouter l'auto-incrément à une clé primaire qui est aussi une clé financière (je ne sais pas pourquoi vous feriez cela).

5voto

Stephen Walcher Points 2066

Je suppose que vous n'avez pas besoin de réincrémenter les données existantes, alors pourquoi ne pouvez-vous pas simplement exécuter une 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 il 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, ce n'est pas testé, mais je pense que ça va marcher.

0 votes

Je ne pense pas que le second ALTER est nécessaire. Et je pense que cela échouera, puisque la syntaxe demande une "valeur", et non une "expression".

5voto

Aucune des solutions ci-dessus n'a fonctionné pour ma table. J'ai une table dont la clé primaire est un nombre entier non signé dont les valeurs vont de 0 à 31543. Il y a actuellement plus de 19 000 enregistrements. J'ai dû modifier la colonne pour 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;

0 votes

C'est crucial, et c'est la seule chose qui a fonctionné pour moi (MySQL 5.6/OSX). Si vous avez déjà une clé primaire qui est pas autoincrément et que vous le modifiez pour qu'il soit autoincrémenté, vous devez (au moins dans ma configuration, qui est 100% par défaut) les faire dans la même déclaration, sinon les INSERTs qui ne fournissent pas l'ID échoueront avec par exemple ERROR 1364 (HY000): Field 'id' doesn't have a default value .

2voto

Ceci a fonctionné pour moi (je voulais rendre l'id primaire et définir l'auto-incrément).

ALTER TABLE table_name CHANGER id id INT CLÉ PRIMAIRE AUTO_INCREMENT ;

0voto

Alex Weinstein Points 5839

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 disposez d'une base de données existante, veillez à préserver les relations entre les clés étrangères qui pourraient déjà exister sur les clés primaires "créées artificiellement".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X