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


157

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


2
Vous pouvez facilement faire la alter tablepour ajouter la clé, mais MySQL ne générera pas d'ID pour les champs qui ne les ont pas déjà. Vous devrez mettre à jour manuellement les champs existants, puis vous assurer que votre nouvel auto_increment commence au bon décalage - il vaut par défaut '1' et vous vous retrouverez de toute façon avec des erreurs de clé en double.
Marc B

3
@MarcB Je viens de tester, et il a en fait inséré les identifiants pour les lignes existantes à partir de 1
Michael Berkowski

Réponses:


253

Une ALTER TABLEinstruction ajoutant la PRIMARY KEYcolonne 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 AUTO_INCREMENT idcolonne et inséré des valeurs d'incrémentation automatique pour chaque ligne existante de la table, en commençant par 1.


1
Oui, cela a été mon expérience. Ne vous souvenez jamais avoir à exécuter un script séparé pour remplir les identifiants auto_increment ...
Mike Purcell

1
lol merci. ma faute. La marque verte est pour vous car la vôtre est alors plus facile à mettre en œuvre. : D
FlyingCat

53
Pour en faire la première colonne, utilisez FIRSTpar exempleALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas

1
Les mécanismes de @Nikkie SQLite sont assez différents. Vous trouverez des suggestions ici stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski

1
@WijaySharma Si vous avez créé la ligne avec auto-incrémentation et que vous devez la récupérer immédiatement par identifiant, MySQL propose LAST_INSERT_ID()cette valeur SELECT * FROM table_name WHERE id = LAST_INSERT_ID()et la plupart des API de langage de programmation offrent une fonction / méthode pour renvoyer cette valeur dans le code de l'application.
Michael Berkowski

51

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 à l'incrémentation automatique à l'aide de la requête suivante:

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

1
Que fait le FIRSTà la fin?
Dementic

1
Cela fera de la nouvelle idcolonne la première du tableau par opposition à la dernière, ce qui est le comportement par défaut.
fmalina

Travaille bien! Merci!
Majedur Rahaman le

4

oui, quelque chose comme ça le ferait, ce n'est peut-être pas le meilleur, vous voudrez peut-être 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++;
}

notez que le que any_fieldvous sélectionnez doit être le même lors de la mise à jour.


4

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

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

Sur MySQL v5.5.31, cela définissait la idcolonne comme clé primaire pour moi et remplissait chaque ligne avec une valeur incrémentielle.


2

Le plus simple et le plus rapide que je trouve est celui-ci

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

2

J'ai pu adapter ces instructions à une table avec une clé primaire non incrémentielle existante , et ajouter une clé primaire incrémentielle à la table et créer une nouvelle clé primaire composite avec les anciennes et les nouvelles clés en tant que clé primaire composite en utilisant ce qui suit code:

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 souhaitez. Avec le "DROP TABLE" en haut, vous pouvez l'exécuter encore et encore pour expérimenter des variations.

Ce que je n'ai pas pu obtenir, c'est la situation où il y a des clés étrangères entrantes qui pointent déjà vers le champ USER_ID. Je reçois ce message lorsque j'essaye de faire un exemple plus complexe avec une clé étrangère entrante 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 détruire toutes les clés étrangères avant de faire la table ALTER, puis les reconstruire par la suite. Mais pour l'instant, je voulais partager cette solution à une version plus difficile de la question originale au cas où d'autres se retrouveraient dans cette situation.


0

Exportez votre table, puis videz votre table, puis ajoutez un champ comme INT unique, puis changez-le en AUTO_INCREMENT, puis importez à nouveau votre table que vous avez exportée précédemment.


0

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

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828

0

J'étais confronté au même problème, alors ce que j'ai fait, j'ai laissé tomber le champ de la clé primaire, puis je l'ai recréé et je me suis assuré qu'il était auto incrémentiel. Cela a fonctionné pour moi. J'espère que ça aide les autres


0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NON NULL AUTO_INCREMENT ;

Ici tableName est le nom de votre table,

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

MEDIUMINT est un type de données de votre clé primaire existante

AUTO_INCREMENT vous devez ajouter juste auto_increment après non null

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

J'espère que cela vous sera utile :)


1
Ce serait utile si vous modifiez et ajoutez des explications.
Shashanth

-1

Comment écrire PHP pour ALTER le champ déjà existant (nom, dans cet exemple) pour en faire une clé primaire? Sans, bien sûr, ajouter des champs "id" supplémentaires à la table.

Ceci est une table actuellement créée - Nombre d'enregistrements trouvés: 4 nom VARCHAR (20) YES race VARCHAR (30) OUI couleur VARCHAR (20) OUI poids SMALLINT (7) OUI

Ceci est un résultat final recherché (DESCRIPTION DU TABLEAU) -

Nombre d'enregistrements trouvés: 4 nom VARCHAR (20) NO PRI race VARCHAR (30) OUI couleur VARCHAR (20) OUI poids SMALLINT (7) OUI

Au lieu de l'obtenir -

Nombre d'enregistrements trouvés: 5 id int (11) NON PRI nom VARCHAR (20) OUI race VARCHAR (30) OUI couleur VARCHAR (20) OUI poids SMALLINT (7) OUI

après avoir essayé ...

$ query = "ALTER TABLE racehorses ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)";

Comment obtenir ceci? -

Nombre d'enregistrements trouvés: 4 nom VARCHAR (20) NO PRI race VARCHAR (30) OUI couleur VARCHAR (20) OUI poids SMALLINT (7) OUI

c'est-à-dire INSERT / ADD .. etc. la clé primaire DANS le premier enregistrement de champ (sans ajouter un champ «id» supplémentaire, comme indiqué précédemment.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.