Mysql
 sql >> Base de données >  >> RDS >> Mysql

créer un ID dans une table mysql auto_increment (après coup)

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 le AUTO_INCREMENT choix :

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

Vérifiez que cela a bien 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 besoin de créer une deuxième colonne et de supprimer la colonne d'origine. La PRIMARY KEY la contrainte n'est pas affectée et vous n'avez pas besoin de la mentionner dans ALTER TABLE déclaration.

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)

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

J'ai aussi testé avec ENGINE=InnoDB et une table dépendante. Modification de l'id la définition de 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é, j'ai pensé que cela fonctionnerait. Voici quelques liens qui peuvent vous aider à diagnostiquer le problème :