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?

Rysował
źródło

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
pugmarx
źródło
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;
zombat
źródło
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
Karla Danitza Duran Memijes
źródło
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!

norodin
źródło
4

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

Rock King Kirant
źródło
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;
Pratik Gaurav
źródło
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

Abinash Hota
źródło
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.

Ronald Wildenberg
źródło
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

Spróbuj tego:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
Shailendra Mishra
źródło
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.

Jyothi M
źródło
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

Owais Akber
źródło