2009-05-08 10 views
128

Ho una tabella la cui chiave primaria è utilizzata in molte altre tabelle e ha diverse chiavi esterne ad altre tabelle.MySQL Rimozione di alcune chiavi esterne

CREATE TABLE location (
    locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ... 
) ENGINE = InnoDB; 

CREATE TABLE assignment (
    assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    locationID INT NOT NULL, 
    FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID) 
    ... 
) ENGINE = InnoDB; 

CREATE TABLE assignmentStuff (
    ... 
    assignmentID INT NOT NULL, 
    FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID) 
) ENGINE = InnoDB; 

Il problema è che quando sto cercando di eliminare una delle colonne chiave esterna (cioè locationIDX) mi dà un errore.

"ERRORE 1025 (HY000): Errore su Rinomina"

Come posso eliminare la colonna nella tabella di assegnazione sopra senza ottenere questo errore?

risposta

332

Come spiegato here, sembra che il vincolo di chiave esterna deve essere caduto da nome di vincolo e non il nome di indice. La sintassi è:

alter table footable drop foreign key fooconstraint 
+25

Questo era il mio problema. Mi sento un po 'stupido ora. Se qualcun altro ha questo problema, è possibile trovare i nomi dei vincoli di chiave esterna utilizzando la funzione SHOW CREATE TABLE. – Drew

+0

ha funzionato per mee – bynu022

+5

Suggerimento: usa 'SHOW CREATE TABLE footable;' per vedere qual è il nome del vincolo. Non è il nome della colonna per se. Grazie per la risposta! –

0

Non è possibile rilasciare la colonna della chiave esterna perché viene referenziata dalla tabella assignmentStuff. Quindi è necessario prima eliminare il vincolo di chiave esterna assignmentStuff.assignmentIDX.

Una domanda simile è già stata posta here. Controlla anche here per maggiori informazioni.

+1

Quindi, perché la chiave primaria assegnazione di riferimenti assignmentStuff, non riesco a eliminare la colonna LocationID di assegnazione? Questo sembra un po 'controproducente. – Drew

+0

Sembra che abbia cambiato alcuni nomi di colonne, quindi la mia risposta non ha molto senso. Scusa per quello ... –

+0

Nessun problema, compagno – Drew

20

Le chiavi esterne sono lì per garantire l'integrità dei dati, quindi non è possibile rilasciare una colonna fintanto che fa parte di una chiave esterna. Devi prima lasciare la chiave.

penserei la seguente domanda avrebbe fatto:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX; 
3

Ecco un modo per eliminare il vincolo di chiave esterna, funzionerà. ALTER TABLE location. location_id DROP FOREIGN KEY location_ibfk_1;

0

Prova questa:

alter table Documents drop 
    FK__Documents__Custo__2A4B4B5E 
8

Come tutti ha detto in precedenza, si può facilmente eliminare un FK. Tuttavia, ho appena notato che può essere necessario rilasciare il KEY stesso ad un certo punto. Se hai qualche messaggio di errore per creare un altro indice come l'ultimo, intendo con lo stesso nome, sarebbe utile eliminare tutto ciò che riguarda quell'indice.

ALTER TABLE your_table_with_fk 
    drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result, 
    drop KEY the_same_name_as_above 
4

Verificare qual è il nome del vincolo e il nome FOREIGN KEY:

SHOW CREATE TABLE table_name; 

Rimuovere sia il nome del vincolo e il nome FOREIGN KEY:

ALTER TABLE table_name 
    DROP FOREIGN KEY the_name_after_CONSTRAINT, 
    DROP KEY the_name_after_FOREIGN_KEY; 

Spero che questo aiuti!

1

In genere si verifica questo errore se le tabelle utilizzano il motore InnoDB. In tal caso, è necessario rilasciare la chiave esterna, quindi eseguire la tabella delle modifiche e rilasciare la colonna.

Ma la parte difficile è che non è possibile rilasciare la chiave esterna utilizzando il nome della colonna, ma invece si dovrebbe trovare il nome utilizzato per indicizzarlo.Per trovarlo, emettere la seguente selezione:

SHOW CREATE TABLE region; Questo dovrebbe mostrarti una riga, nell'angolo in alto a sinistra fai clic sull'opzione +, fai clic sul pulsante di testo completo e poi fai clic. Qui otterrai il nome dell'indice, qualcosa come:

CONSTRAINT region_ibfk_1 FOREIGN CHIAVE (country_id) REFERENCES paese (id) ON DELETE NESSUNA AZIONE SU AGGIORNAMENTO NESSUNA AZIONE Basta emettere un:

alter table region drop foreign key region_ibfk_1;

o

più semplicemente basta digitare: - alter table TableName cadere estera chiave TableName_ibfk_1;

ricordare l'unica cosa è aggiungere _ibfk_1 dopo la vostra tablename per rendere in questo modo: - TableName _ibfk_1