MySQL Usuwanie niektórych kluczy obcych


199

Mam tabelę, której klucz podstawowy jest używany w kilku innych tabelach i ma kilka kluczy obcych do innych tabel.

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;

Problem polega na tym, że kiedy próbuję upuścić jedną z kolumn klucza obcego (tj. LocationIDX), wyświetla mi się błąd.

„ERROR 1025 (HY000): Błąd podczas zmiany nazwy”

Jak mogę usunąć kolumnę w powyższej tabeli przypisań bez tego błędu?

Odpowiedzi:


459

Jak wyjaśniono tutaj , wydaje się, że ograniczenie klucza obcego musi zostać usunięte przez nazwę ograniczenia, a nie nazwę indeksu. Składnia jest następująca:

alter table footable drop foreign key fooconstraint

35
To był mój problem. Czuję się teraz trochę głupio. Jeśli ktokolwiek ma ten problem, możesz znaleźć nazwy ograniczeń klucza obcego za pomocą funkcji SHOW CREATE TABLE.
Drew

15
Wskazówka: użyj, SHOW CREATE TABLE footable;aby zobaczyć, jaka jest nazwa ograniczenia. To nie jest sama nazwa kolumny. Dziękuję za odpowiedź!
Chris Baker

3
Możesz użyć tego do znalezienia ograniczeń klucza obcego: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<your db name>' AND constraint_type = 'FOREIGN KEY'
Gayan Dasanayake

21

Klucze obce służą do zapewnienia integralności danych, więc nie można upuścić kolumny, o ile jest ona częścią klucza obcego. Najpierw musisz upuścić klucz.

Myślę, że wystarczyłoby następujące zapytanie:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

17

Jak wszyscy powiedzieli powyżej, możesz łatwo usunąć FK. Jednak właśnie zauważyłem, że w pewnym momencie może być konieczne upuszczenie samego KEY. Jeśli masz jakiś komunikat o błędzie, aby utworzyć inny indeks, taki jak poprzedni, to znaczy o tej samej nazwie, przydatne byłoby porzucenie wszystkiego, co jest związane z tym indeksem.

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

Sprawdź, jaka jest nazwa OGRANICZENIA i nazwa KLUCZA OBCEGO:

SHOW CREATE TABLE table_name;

Usuń zarówno nazwę CONSTRAINT, jak i nazwę FOREIGN KEY:

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

Mam nadzieję że to pomoże!


4

Oto sposób na usunięcie ograniczenia klucza obcego, zadziała. ALTER TABELA location. location_id DROP FOREIGN KEY location_ibfk_1;


2

Hej, wykonałem powyższą sekwencję i znalazłem rozwiązanie.

SHOW CREATE TABLE footable;

Otrzymasz nazwę ograniczenia FK w stylu

ProjectsInfo_ibfk_1

Teraz musisz usunąć te ograniczenia. przez alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Następnie upuść kolumnę tabeli,

alter table ProjectsInfo drop column clientId;

1

Zwykle pojawia się ten błąd, jeśli Twoje tabele korzystają z silnika InnoDB. W takim przypadku należałoby porzucić klucz obcy, a następnie zmienić tabelę i usunąć kolumnę.

Problem polega jednak na tym, że nie można usunąć klucza obcego przy użyciu nazwy kolumny, ale zamiast tego trzeba byłoby znaleźć nazwę używaną do indeksowania. Aby to znaleźć, wybierz następujące opcje:

POKAŻ STWÓRZ TABELĘ region; To powinno pokazać ci wiersz, w lewym górnym rogu kliknij opcję +, kliknij przycisk pełnego tekstu raio, a następnie kliknij idź. Tam pojawi się nazwa indeksu, coś takiego:

OGRANICZANIE region_ibfk_1 KLUCZ ZAGRANICZNY (country_id) REFERENCJE kraj (id) PRZY USUNIĘCIU ŻADNEJ AKCJI PRZY AKTUALIZACJI BRAK AKCJI Teraz wystarczy wydać:

zmień region tabeli usuń klucz obcy region_ibfk_1;

lub

prościej po prostu wpisz: - zmień tabelę NazwaTabeli usuń klucz obcy NazwaTabeli_ibfk_1 ;

pamiętaj, że jedyną rzeczą jest dodanie _ibfk_1 po nazwie tabeli, aby uzyskać następującą postać : - TableName _ibfk_1


0

Nie można usunąć kolumny klucza obcego, ponieważ odwołuje się do niej z tabeli assignmentStuff. Więc powinieneś najpierw usunąć ograniczenie klucza obcego assignmentStuff.assignmentIDX.

Podobne pytanie zostało już tutaj zadane . Sprawdź także tutaj, aby uzyskać więcej informacji.


1
Tak więc, ponieważ assignmentStuff odwołuje się do klucza podstawowego przypisania, nie mogę usunąć kolumny locationID przypisania? Wydaje się to sprzeczne z intuicją.
Drew

Wygląda na to, że zmieniłem nazwy niektórych kolumn, więc moja odpowiedź nie ma sensu. Przepraszam za to ...
Ronald Wildenberg


0

krok 1: show create table vendor_locations;

krok 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

to działało dla mnie.


0

najpierw należy uzyskać rzeczywistą nazwę ograniczenia za pomocą tego zapytania

SHOW CREATE TABLE TABLE_NAME

To zapytanie spowoduje ograniczenie nazwy klucza obcego, teraz poniższe zapytanie go usunie.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

ostatnia liczba w powyższej nazwie ograniczenia zależy od liczby kluczy obcych w tabeli

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.