MySQL Rimozione di alcune chiavi esterne


190

Ho una tabella la cui chiave primaria viene utilizzata in diverse altre tabelle e ha diverse chiavi esterne ad altre tabelle.

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 di chiave esterna (cioè locationIDX) mi dà un errore.

"ERRORE 1025 (HY000): errore durante la ridenominazione"

Come posso eliminare la colonna nella tabella delle assegnazioni sopra senza ottenere questo errore?

Risposte:


447

Come spiegato qui , sembra che il vincolo della chiave esterna debba essere eliminato in base al nome del vincolo e non al nome dell'indice. La sintassi è:

alter table footable drop foreign key fooconstraint

35
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

14
Suggerimento: usare SHOW CREATE TABLE footable;per vedere qual è il nome del vincolo. Non è il nome della colonna di per sé. Grazie per la risposta!
Chris Baker,

2
Puoi usarlo per trovare i vincoli di chiave esterna: SELEZIONA * DA information_schema.table_constraints DOVE vincolo_schema = '<il tuo nome db>' AND
vincolo_tipo

21

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

Penso che la seguente query lo farebbe:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

Come tutti hanno detto sopra, puoi facilmente eliminare un FK. Tuttavia, ho appena notato che può essere necessario rilasciare la chiave stessa 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

10

Controlla qual è il nome VINCITORE e il nome CHIAVE ESTERA:

SHOW CREATE TABLE table_name;

Rimuovere sia il nome VINCITORE che il nome CHIAVE ESTERA:

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

Spero che questo ti aiuti!


4

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


2

Ehi, ho seguito una sequenza sopra e ho trovato una soluzione.

SHOW CREATE TABLE footable;

Otterrai Nome vincolo FK come

ProjectsInfo_ibfk_1

Ora è necessario rimuovere questi vincoli. da alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Quindi rilascia la colonna della tabella,

alter table ProjectsInfo drop column clientId;

1

Di solito questo errore viene visualizzato se le tabelle utilizzano il motore InnoDB. In tal caso dovresti rilasciare la chiave esterna, quindi eseguire la tabella di modifica e rilasciare la colonna.

Ma la parte difficile è che non puoi rilasciare la chiave esterna usando il nome della colonna, ma invece dovresti trovare il nome usato per indicizzarla. Per trovarlo, emetti la seguente selezione:

MOSTRA CREA TABELLA regione; Questo dovrebbe mostrarti una riga, nell'angolo in alto a sinistra fai clic sull'opzione +, fai clic sul pulsante raio testo completo, quindi fai clic su Vai. Qui otterrai il nome dell'indice, qualcosa del genere:

CONSTRAINT region_ibfk_1 TASTO ESTERO (country_id) RIFERIMENTI country (id) ON ELIMINA NO AZIONE AGGIORNAMENTO NO AZIONE Ora emetti semplicemente un:

modifica tabella area drop chiave esterna region_ibfk_1;

o

più semplicemente basta digitare: - alter table TableName drop chiave esterna TableName_ibfk_1 ;

ricorda che l'unica cosa è aggiungere _ibfk_1 dopo il tuo tablename per fare così: - TableName _ibfk_1


0

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

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


1
Quindi, poiché taskmentStuff fa riferimento alla chiave primaria dell'assegnazione, non riesco a eliminare la colonna locationID dell'assegnazione? Sembra una specie di contro intuitivo.
Ha

Sembra che abbia cambiato alcuni nomi di colonna, quindi la mia risposta non ha davvero senso. Scusatemi per questo ...
Ronald Wildenberg,


0

passo 1: show create table vendor_locations;

passo 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

ha funzionato per me.


0

per prima cosa è necessario ottenere il nome effettivo del vincolo da questa query

SHOW CREATE TABLE TABLE_NAME

Questa query determinerà il vincolo del nome della chiave esterna, ora sotto la query la lascerà cadere.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

l'ultimo numero nel nome del vincolo sopra dipende da quante chiavi esterne hai nella tabella

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.