Come aggiungere una chiave primaria a una tabella MySQL?


103

Questo è quello che ho provato ma non riesce:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

Qualcuno ha un suggerimento?


11
Quando qualcosa fallisce , è sempre una buona idea specificare cosa significa fallire : ricevi un messaggio di errore? quale ?
Pascal MARTIN

Immagino che il messaggio di errore sia simile a: più chiavi primarie definite
LMD

Risposte:


226

Dopo aver aggiunto la colonna, puoi sempre aggiungere la chiave primaria:

ALTER TABLE goods ADD PRIMARY KEY(id)

Per quanto riguarda il motivo per cui il tuo script non funzionava, devi specificare PRIMARY KEY, non solo la parola PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

Per me dice: questo definirebbe più chiavi primarie. Sto usando InnoDB. Nota che ne ho già 3.
LMD

2
Lo metterei sicuramente FIRSTdopo AUTO_INCREMENT, il che significa che idsarà la prima colonna della tabella già esistente. Altrimenti verrà messo alla fine della tabella come è scritto ora, il che può creare un po 'di confusione quando si fa sempliceSELECT * ...
StefanK

Come ottenere un primo posto nella nuova colonna "id"
TipVisor il

17

Colonna esistente

Se si desidera aggiungere un vincolo di chiave primaria a una colonna esistente, tutta la sintassi precedentemente elencata fallirà.

Per aggiungere un vincolo di chiave primaria a una colonna esistente utilizzare il modulo:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

1
mysql non riconosce MODIFY come istruzione corretta (almeno in XAMPP, InnoDB)
LMD

@ LMD In quale versione di mysql utilizzi? (NOTA: so che ha funzionato nel momento in cui l'ho postato e credo che fosse 5.6 ... ma non me lo ricordo con certezza)
MER

1
Se anche a te, come per me, non funziona sostituisci MODIFICA con CAMBIA e funzionerà!
csr-nontol

12

Se il tuo tavolo è abbastanza grande, meglio non usare l'affermazione:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

perché fa una copia di tutti i dati in una tabella temporanea, altera la tabella e poi la copia di nuovo. Meglio farlo manualmente. Rinomina la tua tabella:

rename table goods to goods_old;

crea una nuova tabella con chiave primaria e tutti gli indici necessari:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

sposta tutti i dati dalla vecchia tabella alla nuova, disabilitando chiavi e indici per velocizzare la copia:

- UTILIZZA QUESTO PER I TAVOLI MyISAM :

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

O

- USA QUESTO PER I TAVOLI InnoDB :

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

Sono necessari 2000 secondi per aggiungere PK a una tabella con ~ 200 mln di righe.


Sono rimasto sorpreso di quanto tempo ho avuto bisogno di cercare per trovare questa risposta. Grazie per questi utili esempi.
Ryan

4

Non sono sicuro che sia importante per qualcun altro, ma preferisco la tabella id alla prima colonna del database. La sintassi per questo è:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Che è solo un leggero miglioramento rispetto alla prima risposta. Se volevi che fosse in una posizione diversa, allora

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH, -ft


3

Usa questa query,

alter table `table_name` add primary key(`column_name`);

2

Questo codice funziona nel mio database mysql:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);


0

Prova questo,

alter table goods add column `id` int(10) unsigned primary key auto_increment

0

Per me, nessuno dei suggerimenti ha funzionato dandomi errori di sintassi, quindi ho provato a utilizzare phpmyadmin (versione 4.9.2), (10.4.10-MariaDB) e aggiunta di una idcolonna con chiave primaria a incremento automatico. Idcolonna è stata aggiunta piacevolmente dal primo elemento.

L'output della query era:

ALTER TABLE table_nameADD idINT NOT NULL AUTO_INCREMENT PRIMA, ADD PRIMARY KEY ( id);


-3

Rimuovi le virgolette per funzionare correttamente ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
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.