Insérer auto incrémenter la clé primaire à 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 DB et je veux leur donner un id mais je ne veux pas le faire manuellement). Toutes les pensées? Mille mercis.

132
demandé sur Carrie Kendall 2012-01-31 01:05:50

11 réponses

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éé AUTO_INCREMENT id colonne et valeurs d'incrémentation automatique insérées pour chaque ligne existante de la table, en commençant par 1.

217
répondu Michael Berkowski 2014-12-16 02:42:01

Supposons que vous n'ayez pas de colonne pour l'incrément 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, modifiez l'incrément automatique en utilisant la requête suivante:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
40
répondu php 2015-09-01 11:08:21

Pour ceux comme moi qui 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éfinit la colonne id comme clé primaire pour moi et remplit chaque ligne avec une valeur incrémentée.

4
répondu reflexiv 2013-09-25 16:08:25

Oui, quelque chose comme ça le ferait, pourrait ne pas être le meilleur, vous pourriez vouloir 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 any_field que vous sélectionnez doit être le même lors de la mise à jour.

3
répondu Grigor 2012-01-30 21:10:30

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);
3
répondu Dave 2014-10-29 08:43:36

J'ai pu adapter ces instructions prendre une table avec une clé primaireexistante non-incrémentée, et ajouter une clé primaire incrémentée à 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 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 a toutes les valeurs numériques pour la clé primaire exactement comme vous pouvez vous y attendre. Avec le "DROP TABLE" en haut, vous pouvez l'Exécuter encore et encore à expérimentez avec des variations.

Ce que je n'ai pas réussi à faire fonctionner, c'est la situation où il y a des clés étrangères entrantes qui pointent déjà sur le champ USER_ID. Je reçois ce message quand j'essaie 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 devine que j'ai besoin de détruire toutes les clés étrangères avant de faire la table ALTER, puis de les reconstruire par la suite. Mais pour l'instant je voulais partager cette solution à une version plus difficile de la question initiale dans le cas où d'autres ont rencontré cette situation.

2
répondu drchuck 2015-06-29 14:10:38

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

1
répondu David C 2015-07-10 04:41:33

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
répondu Nagesh Hugar 2017-02-23 11:53:12

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

0
répondu Humphrey 2017-12-14 07:25:48

Modifier la TABLE tableName Modifier tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT;

Ici tableName est le nom de votre table,

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

MEDIUMINT {[2] } est un type de données de votre clé primaire existante

AUTO_INCREMENT vous devez ajouter juste auto_increment après not null

Il fera cette clé primaire auto_increment......

J'espère que cela est utile:)

0
répondu Hrushikesh vanga 2018-09-10 19:01:14

Comment écrire PHP pour modifier 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..

Cette table est actuellement créée-nombre d'enregistrements trouvés: 4 Nom VARCHAR (20) Oui Race VARCHAR (30) Oui couleur VARCHAR (20) Oui poids SMALLINT (7) Oui

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

Nombre d'enregistrements trouvés: 4 nom VARCHAR (20) Pas de PRI Race VARCHAR (30) Oui couleur VARCHAR (20) OUI poids SMALLINT (7) Oui

Au lieu d'obtenir ceci -

Nombre d'Enregistrements trouvés: 5 id int (11) no 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 cela? -

Nombre d'enregistrements trouvés: 4 nom VARCHAR (20) Pas de PRI Race VARCHAR (30) Oui couleur VARCHAR (20) Oui poids SMALLINT (7) Oui

C'est-à-dire insérer/ajouter. . etc. la clé primaire dans le premier enregistrement de champ (sans ajout d'un champ 'id' supplémentaire, comme indiqué précédemment.

-1
répondu De Teague 2015-12-18 18:10:30