Inserisci la chiave primaria di incremento automatico nella tabella esistente


157

Sto cercando di modificare una tabella che non ha chiave primaria né colonna auto_increment. So come aggiungere una colonna chiave primaria ma mi chiedevo se fosse possibile inserire automaticamente i dati nella colonna chiave primaria (ho già 500 righe nel DB e voglio dare loro l'id ma non voglio farlo manualmente) . qualche idea? Molte grazie.


2
Puoi facilmente alter tableaggiungere la chiave, ma MySQL non genererà ID per campi che non li hanno già. Dovrai aggiornare manualmente i campi esistenti e quindi assicurarti che il tuo nuovo auto_increment inizi con l'offset giusto: il valore predefinito è "1" e finiresti comunque per duplicare errori chiave.
Marc B,

3
@MarcB Ho appena provato, e infatti ha inserito gli ID per le righe esistenti a partire da 1
Michael Berkowski

Risposte:


253

Un'istruzione ALTER TABLEche aggiunge la PRIMARY KEYcolonna funziona correttamente nei miei test:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

Su una tabella temporanea creata a scopo di test, l'istruzione precedente ha creato la AUTO_INCREMENT idcolonna e ha inserito i valori di incremento automatico per ogni riga esistente nella tabella, iniziando con 1.


1
Sì, questa è stata la mia esperienza. Non ricordare mai di aver dovuto eseguire uno script separato per popolare gli ID auto_increment ...
Mike Purcell,

1
ahah grazie. colpa mia. Il segno verde è per te poiché il tuo è più facile da implementare allora. : D
FlyingCat

53
Per renderlo la prima colonna, utilizzare FIRSTad es.ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas

1
Le meccaniche di @Nikkie SQLite sono abbastanza diverse. Troverete suggerimenti qui stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski

1
@WijaySharma Se hai creato la riga con auto-incremento e devi recuperarla immediatamente tramite id, MySQL offre LAST_INSERT_ID()quel valore SELECT * FROM table_name WHERE id = LAST_INSERT_ID()e la maggior parte delle API del linguaggio di programmazione offrono alcune funzioni / metodi per restituire quel valore nel codice dell'applicazione.
Michael Berkowski,

51

supponiamo di non avere una colonna per l'incremento automatico come id, no, quindi puoi aggiungere usando la seguente query:

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

Se hai una colonna, quindi modifica l'incremento automatico usando la seguente query:

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

1
Cosa fa FIRSTalla fine?
Demenza

1
Renderà la nuova idcolonna la prima nella tabella anziché l'ultima, che è il comportamento predefinito.
fmalina,

Funziona bene! Grazie!
Majedur Rahaman,

4

sì, qualcosa del genere lo farebbe, potrebbe non essere il migliore, potresti voler fare un backup

$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++;
}

notare che la any_fieldselezione deve essere la stessa durante l'aggiornamento.


4

Per quelli come me che ottengono un Multiple primary key definederrore, prova:

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

Su MySQL v5.5.31 questo ha impostato la idcolonna come chiave primaria per me e ha popolato ogni riga con un valore crescente.


2

Il più semplice e veloce che trovo è questo

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

2

Sono stato in grado di adattare queste istruzioni per prendere una tabella con una chiave primaria non incrementale esistente e aggiungere una chiave primaria incrementale alla tabella e creare una nuova chiave primaria composita con le chiavi vecchie e nuove come chiave primaria composita usando la seguente codice:

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

Al termine, il campo _USER_ID esiste e contiene tutti i valori numerici per la chiave primaria esattamente come ci si aspetterebbe. Con la "DROP TABLE" nella parte superiore, puoi ripeterlo più volte per sperimentare le variazioni.

Quello che non sono stato in grado di far funzionare è la situazione in cui ci sono CHIAVI ESTERI in arrivo che già indicano il campo USER_ID. Ricevo questo messaggio quando provo a fare un esempio più complesso con una chiave esterna in arrivo da un'altra tabella.

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

Immagino che ho bisogno di abbattere tutte le chiavi esterne prima di fare il tavolo ALTER e poi ricostruirle in seguito. Ma per ora volevo condividere questa soluzione con una versione più stimolante della domanda originale nel caso in cui altri si fossero imbattuti in questa situazione.


0

Esporta la tabella, quindi svuota la tabella, quindi aggiungi il campo come INT univoco, quindi modificalo in AUTO_INCREMENT, quindi importa nuovamente la tabella che hai esportato in precedenza.


0

È possibile aggiungere una nuova colonna Chiave primaria a una tabella esistente, che può avere numeri di sequenza, usando il comando:

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

Stavo affrontando lo stesso problema, quindi quello che ho fatto ho lasciato cadere il campo per la chiave primaria, quindi l'ho ricreato e mi sono assicurato che fosse auto incrementale. Questo ha funzionato per me. Spero che aiuti gli altri


0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

Qui tableName è il nome della tua tabella,

tableName è il nome della colonna che è primario deve essere modificato

MEDIUMINT è un tipo di dati della chiave primaria esistente

AUTO_INCREMENT devi aggiungere solo auto_increment dopo non null

Renderà tale chiave primaria auto_increment ......

Spero che questo sia utile :)


1
Sarebbe utile se modifichi e aggiungi qualche spiegazione.
Shashanth,

-1

Come scrivere PHP su ALTER il campo già esistente (nome, in questo esempio) per renderlo una chiave primaria? Senza ovviamente aggiungere ulteriori campi "id" alla tabella.

Questa è una tabella attualmente creata - Numero di record trovati: 4 nome VARCHAR (20) SÌ razza VARCHAR (30) SÌ colore VARCHAR (20) SÌ peso SMALLINT (7) SÌ

Si è cercato questo risultato finale (TABELLA DESCRIZIONE) -

Numero di record trovati: 4 nome VARCHAR (20) NO PRI razza VARCHAR (30) SÌ colore VARCHAR (20) SÌ peso SMALLINT (7) SÌ

Invece di ottenere questo -

Numero di record trovati: 5 id int (11) NO Nome PRI VARCHAR (20) SÌ razza VARCHAR (30) SÌ colore VARCHAR (20) SÌ peso SMALLINT (7) SÌ

dopo aver provato ..

$ query = "ALTER TABLE cavalli da corsa ADD id INT NOT NULL AUTO_INCREMENT PRIMA, ADD PRIMARY KEY (id)";

Come si può ottenere? -

Numero di record trovati: 4 nome VARCHAR (20) NO PRI razza VARCHAR (30) SÌ colore VARCHAR (20) SÌ peso SMALLINT (7) SÌ

cioè INSERIRE / AGGIUNGERE ... ecc. la chiave primaria nel primo record di campo (senza aggiungere un campo "id" aggiuntivo, come indicato in precedenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.