Jak usunąć ograniczenia z mojej tabeli MySQL?

252

Chcę usunąć ograniczenia z mojej tabeli. Moje zapytanie to:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Ale dostałem błąd:

#1064- Wystąpił błąd w składni SQL; sprawdź w instrukcji, która odpowiada wersji serwera MySQL, czy jest poprawna składnia do użycia w pobliżu „ograniczenia FK_tbl_magazine_issue_mst_users” w wierszu 1

deepu sankar
źródło
1
Warto zauważyć, że jeśli utworzono CHECKograniczenie, nie trzeba go usuwać, ponieważ nie powstaje żadne rzeczywiste ograniczenie. Możesz wybrać opcję information_schema.table_constraintsdo weryfikacji, a nawet bez przerwy uruchamiać od add constraintnowa. MySQL nie obsługuje CHECKograniczeń, ale pozwala SQLowi na ich utworzenie (bez faktycznego tworzenia ograniczeń).
ADTC
Możliwy duplikat Usuń klucz podstawowy w MySQL
劉鎮瑲
Twoja składnia jest całkowicie poprawna, a teraz jest obsługiwana demo
Łukasz Szozda

Odpowiedzi:

423

Mysql ma specjalną składnię do usuwania ograniczeń klucza obcego:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
Czeski
źródło
21
Postgres, MSSQL i Oracle mają alter table .. drop constraint. Wygląda na to, że MySQL jest dziwny.
Jared Beck
Mówi, że nie może upuścić „kolumny 2”, ponieważ jest potrzebny w ograniczeniu klucza obcego. Kiedy robię tak, jak mówisz, otrzymuję „Nie mogę DROP kolumna2; sprawdź, czy kolumna / klucz istnieje”
Lealo
Dobra, rozumiem, obcy jest osobną rzeczą po prostu łącząc kolumnę z innymi kolumnami tabel. Mojemu nadano standardową nazwę. Również teraz mogę teraz bezpiecznie upuścić klucze obce bez upuszczania samej kolumny
Lealo
1
Rozwiązanie Wellington Lorindo może być postrzegane jako bardziej poprawne, ponieważ samo usunięcie klucza obcego nie spowoduje usunięcia powiązanego indeksu. Oczywiście indeks mógł zostać utworzony osobno, ale jeśli został utworzony w wyniku dodania klucza obcego w pierwszej kolejności, to nie zostanie usunięty po prostu przez upuszczenie klucza obcego.
Rich Harding
55

Miałem ten sam problem i udało mi się rozwiązać za pomocą tego kodu:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;
Wellington Lorindo
źródło
2
Można to uznać za bardziej poprawne niż zaakceptowane rozwiązanie, ponieważ samo usunięcie klucza obcego nie spowoduje usunięcia indeksu. Oczywiście indeks mógł zostać utworzony osobno, ale jeśli został utworzony w wyniku dodania klucza obcego w pierwszej kolejności, nie zostanie usunięty po prostu przez upuszczenie klucza obcego.
Rich Harding
3
Jako jedno polecenie: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte,
26

Nie ma czegoś takiego jak DROP CONSTRAINTw MySQL. W twoim przypadku możesz użyć DROP FOREIGN KEYzamiast tego.

Lothar
źródło
12

Jeśli ograniczenie nie jest kluczem obcym, np. jeden dodany przy użyciu „UNIKALNEGO OGRANICZENIA (colA, colB)”, to jest to indeks, który można usunąć za pomocąALTER TABLE ... DROP INDEX ...

Robert Knight
źródło
9

Również fajnie, możesz tymczasowo wyłączyć wszystkie kontrole kluczy obcych z bazy danych mysql: SET FOREIGN_KEY_CHECKS=0; I aby włączyć to ponownie: SET FOREIGN_KEY_CHECKS=1;

roelleor
źródło
8

Aby dodać trochę do odpowiedzi Roberta Knighta, ponieważ sam tytuł postu nie wspomina o kluczach obcych (a ponieważ jego nie ma pełnych próbek kodu i ponieważ bloki kodu komentarza SO nie pokazują się tak dobrze jak kod odpowiedzi bloki), dodam to dla unikalnych ograniczeń. Każda z tych czynności powoduje usunięcie ograniczenia:

ALTER TABLE `table_name` DROP KEY `uc_name`;

lub

ALTER TABLE `table_name` DROP INDEX `uc_name`;
jbobbins
źródło
4

Niektóre ORM lub frameworki używają innej konwencji nazewnictwa dla kluczy obcych niż domyślna FK_[parent table]_[referenced table]_[referencing field], ponieważ można je zmienić.

Na przykład Laravel używa [parent table]_[referencing field]_foreignjako konwencji nazewnictwa. Możesz wyświetlić nazwy kluczy obcych za pomocą tego zapytania, jak pokazano tutaj :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

Następnie usuń klucz obcy, uruchamiając wcześniej wspomniane zapytanie DROP FOREIGN KEY i jego prawidłową nazwę.

piscator
źródło
2

Dla tych, którzy przychodzą tutaj za pomocą MariaDB:

Zauważ, że MariaDB zezwala ogólnie na DROP CONSTRAINT, na przykład na usuwanie ograniczeń sprawdzania:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/

Markus Barthlen
źródło
Tak, dotyczy to na przykład ograniczeń zawartych w tej samej tabeli CONSTRAINT CHECK(a > b). W przypadku ograniczeń klucza obcego wydaje się, że nadal potrzebujesz DROP FOREIGN KEYskładni, przynajmniej w wersji Maria.2D 10.2
Frank Forte
1
  1. Przejdź do widoku struktury tabeli
  2. Na górze zobaczysz 2 opcje a. Struktura tabeli b. Widok relacji .
  3. Teraz kliknij widok Relacja , tutaj możesz usunąć ograniczenie klucza obcego. Tutaj dostaniesz całą relację.
Akshay Sharma
źródło
To świetnie, działało dla mnie, gdy nie znasz identyfikatora
Silviu St
0

Nie ma w DROP CONSTRAINTMySql. To działa jak magia w mysql 5.7

ALTER TABLE answer DROP KEY const_name;
Youness HARDI
źródło
0

Najprostszym sposobem na usunięcie ograniczenia jest użycie składni ALTER TABLE tbl_name DROP CONSTRAINT symbol;wprowadzonej w MySQL 8.0.19 :

Począwszy od MySQL 8.0.19, ALTER TABLE zezwala na bardziej ogólną (i standard SQL) składnię na usuwanie i modyfikowanie istniejących ograniczeń dowolnego typu, gdzie typ ograniczenia jest określany na podstawie nazwy ograniczenia

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> demo skrzypiec

Łukasz Szozda
źródło
-4

zadziała to na MySQL, aby usunąć ograniczenia

alter table tablename drop primary key;

alter table tablename drop foreign key;
Ranjitha
źródło
DROP PRIMARY KEYnie powinno działać. DROP FOREIGN KEYdziała, ale musisz określić, komu drop. Na przykładALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre