web-dev-qa-db-fra.com

Insérer une clé primaire à incrémentation automatique dans la table existante

J'essaie de modifier une table qui n'a pas de clé primaire ni de colonne auto_increment. Je sais comment ajouter une colonne de clé primaire, mais je me demandais s'il était possible d'insérer automatiquement des données dans la colonne de clé primaire (j'ai déjà 500 lignes dans la base de données et je souhaite leur donner un identifiant, mais je ne souhaite pas le faire manuellement) . Des pensées? Merci beaucoup.

140
FlyingCat

Une instruction ALTER TABLE ajoutant la colonne PRIMARY KEY fonctionne correctement dans mes tests:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

Sur une table temporaire créée à des fins de test, l'instruction ci-dessus a créé la colonne AUTO_INCREMENTid et inséré des valeurs d'incrémentation automatique pour chaque ligne existante de la table, en commençant par 1.

226
Michael Berkowski

supposons que vous n'ayez pas de colonne pour l'incrémentation automatique comme id, non, alors vous pouvez ajouter en utilisant la requête suivante:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

Si vous avez une colonne, passez en incrémentation automatique en utilisant la requête suivante:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
40
php

Pour ceux qui, comme moi, obtiennent une erreur Multiple primary key defined, essayez:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

Sur MySQL v5.5.31, cela définissait la colonne id comme clé primaire pour moi et renseignait chaque ligne avec une valeur incrémentante.

4
reflexiv

oui, quelque chose comme cela le ferait, pourrait ne pas être le meilleur cependant, vous pouvez faire une sauvegarde

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

remarquez que le any_field que vous avez sélectionné doit être identique lors de la mise à jour.

3
Grigor

Le plus facile et le plus rapide que je trouve est-ce

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);
2
Dave

J'ai pu adapter ces instructions en prenant une table avec une clé primaire existante non-incrémentée, et en ajoutant une clé primaire incrémentante à la table et en créant une nouvelle clé primaire composite avec l'ancienne et la nouvelle clé en tant que clé primaire composite. clé en utilisant le code suivant:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

Lorsque cela est fait, le champ _USER_ID existe et contient toutes les valeurs numériques de la clé primaire exactement comme vous le souhaitiez. Avec "DROP TABLE" en haut, vous pouvez répéter cette opération pour expérimenter des variations.

Ce que je n’ai pas réussi à faire, c’est la situation où il ya des clés FOREIGN KEY entrantes qui pointent déjà vers le champ USER_ID. Je reçois ce message lorsque j'essaie de créer un exemple plus complexe avec une clé étrangère entrante provenant d'une autre table.

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

Je suppose que je dois supprimer toutes les clés étrangères avant d’effectuer la table ALTER, puis de les reconstruire par la suite. Mais pour l’instant, je voulais partager cette solution avec une version plus complexe de la question initiale au cas où d’autres se retrouveraient dans cette situation.

2
drchuck

ALTER TABLE tableName MODIFY tableNameID MEDIUMINTNOT NULL AUTO_INCREMENT ;

Ici nomTable est le nom de votre table,

nomTable est le nom de votre colonne qui est primaire doit être modifié

MEDIUMINTest un type de données de votre clé primaire existante

AUTO_INCREMENT vous devez simplement ajouter auto_increment après null

Cela rendra cette clé primaire auto_increment ......

J'espère que c'est utile :)

0
Hrushikesh vanga

J'étais confronté au même problème, j'ai donc supprimé le champ de la clé primaire, puis je l'ai recréé et vérifié qu'il est auto incrémental. Cela a fonctionné pour moi. J'espère que ça aide les autres 

0
Humphrey

Vous pouvez ajouter une nouvelle colonne de clé primaire à une table existante, qui peut avoir des numéros de séquence, en utilisant la commande 

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
0
Nagesh Hugar

Exportez votre table, videz-la, ajoutez un champ en tant que INT unique, puis remplacez-le par AUTO_INCREMENT, puis réimportez votre table que vous avez précédemment exportée. 

0
David C