Rimuovere la chiave primaria in MySQL


182

Ho il seguente schema di tabella che mappa i user_customers alle autorizzazioni su un database MySQL live:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Vorrei rimuovere le chiavi primarie per user_customer_id e permesso_id e conservare la chiave primaria per id.

Quando eseguo il comando:

alter table user_customer_permission drop primary key;

Ottengo il seguente errore:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

Come posso rilasciare la chiave primaria di una colonna?

Risposte:


286

Senza un indice, mantenere una colonna di incremento automatico diventa troppo costoso, ecco perché MySQLrichiede che una colonna di incremento automatico sia la parte più a sinistra di un indice.

È necessario rimuovere la proprietà di incremento automatico prima di rilasciare la chiave:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

Nota che hai un composito PRIMARY KEYche copre tutte e tre le colonne e idnon è garantito che sia unico.

Se sembra essere unico, puoi farlo diventare un PRIMARY KEYe AUTO_INCREMENTancora:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

Non dovrei quindi ripristinare la colonna ID come chiave primaria auto_increment? modifica tabella user_customer_permission aggiungi chiave primaria (id); alter table user_customer_permission change id id int (11) auto_increment;
segna il

@markb: se ripristini la chiave primaria, puoi sicuramente ripristinarla AUTO_INCREMENT.
Quassnoi,

cosa significa che la colonna di incremento automatico è una parte all'estrema sinistra del PRIMARY KEY. ?
Arup Rakshit,

1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… Per utilizzare il AUTO_INCREMENTmeccanismo con una tabella InnoDB, è necessario definire una AUTO_INCREMENTcolonna ai_colcome parte di un indice in modo che sia possibile eseguire l'equivalente di una SELECT MAX(ai_col)ricerca indicizzata sulla tabella per ottenere il valore massimo della colonna. In genere, ciò si ottiene rendendo la colonna la prima colonna di un indice di tabella.
Quassnoi,

dice che PRIMARY non è definito. Perché questo accade? Quindi ho dovuto eliminare e aggiungere di nuovo la colonna ID senza specificare la chiave primaria
mrbengi

121

Una linea:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

Inoltre, non perderai l'incremento automatico e dovrai aggiungerlo di nuovo, che potrebbe avere effetti collaterali.


5
Penso che questa risposta debba fluttuare verso l'alto poiché non solo rimuove la necessità di cambiare la definizione del campo, ma consente anche il cambiamento attraverso l'alterazione dei vincoli fk sulla tabella - mi ha davvero aiutato!
tomfumb

Perfetto ! Per me il rilascio della chiave primaria non ha funzionato, anche se modifico il campo per eliminare l'incremento automatico. Ma questa soluzione funziona bene!
user2447161

14

Credo che Quassnoi abbia risposto alla tua domanda diretta. Solo una nota a margine: forse questa è solo una formulazione imbarazzante da parte tua, ma sembra che tu abbia l'impressione di avere tre chiavi primarie, una su ciascun campo. Questo non è il caso. Per definizione, puoi avere solo una chiave primaria. Quello che hai qui è una chiave primaria che è un composto di tre campi. Pertanto, non è possibile "rilasciare la chiave primaria su una colonna". È possibile rilasciare la chiave primaria o non rilasciare la chiave primaria. Se si desidera una chiave primaria che include solo una colonna, è possibile rilasciare la chiave primaria esistente su 3 colonne e creare una nuova chiave primaria su 1 colonna.


11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;

7

Se hai una chiave primaria composita, fai come questo- ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);


5

"se ripristini la chiave primaria, puoi sicuramente ripristinarla su AUTO_INCREMENT"

Non ci dovrebbero essere dubbi sul fatto che sia desiderabile "ripristinare la proprietà PK" e "ripristinare la proprietà di incremento automatico" della colonna ID.

Dato che era un autoincremento nella definizione precedente della tabella, è molto probabile che esista un programma che si inserisce in questa tabella senza fornire un valore ID (poiché la colonna ID è comunque autoincrementata).

Qualsiasi operazione di tale programma si interromperà non ripristinando la proprietà di autoincremento.


3

Prima modifica la colonna per rimuovere il campo auto_increment in questo modo: alter table user_customer_permission modifica ID colonna int;

Successivamente, rilascia la chiave primaria. alter table user_customer_permission drop chiave primaria;



1

Ho avuto lo stesso problema e accanto ad alcuni valori nella mia tabella. Anche se ho cambiato la mia chiave primaria con

ALTER TABLEDROP PRIMARY KEY , ADD PRIMARY KEY (id user_customer_permission)

problema continuato sul mio server. Ho creato un nuovo campo all'interno della tabella Ho trasferito i valori in un nuovo campo e cancellato quello vecchio, problema risolto !!


1

Per aggiungere la chiave primaria nella colonna.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

Per rimuovere la chiave primaria dalla tabella.

ALTER TABLE table_name DROP PRIMARY KEY;

0

Primo backup del database. Quindi rilasciare qualsiasi chiave esterna associata alla tabella. tronca la tabella delle chiavi esterne. Tronca la tabella corrente. Rimuovere le chiavi primarie richieste. Usa sqlyog o workbench o heidisql o dbeaver o phpmyadmin.


0

Trova la tabella in SQL Manager, fai clic con il pulsante destro del mouse e seleziona design, quindi fai clic con il pulsante destro del mouse sull'icona della chiave piccola e seleziona Rimuovi chiave primaria.


Sebbene questo post possa risolvere la domanda, includere uno screenshot aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e che quelle persone potrebbero non conoscere la stessa UI che stai guardando.
Pirate X
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.