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.
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.
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
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.
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.
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);
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.
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.
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
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
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:)
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.