Wie entferne ich Einschränkungen aus meiner MySQL-Tabelle?

252

Ich möchte Einschränkungen aus meiner Tabelle entfernen. Meine Anfrage lautet:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Aber ich habe einen Fehler bekommen:

#1064- Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'Einschränkung FK_tbl_magazine_issue_mst_users' in Zeile 1

Deepu Sankar
quelle
1
Wenn Sie eine CHECKEinschränkung erstellt haben, müssen Sie sie nicht löschen, da keine tatsächliche Einschränkung erstellt wird. Sie können aus auswählen information_schema.table_constraints, um zu überprüfen, und Sie können das sogar add constraintimmer und immer wieder ohne Fehler ausführen . MySQL unterstützt keine CHECKEinschränkungen, lässt jedoch zu, dass SQL diese erstellen soll (ohne die Einschränkungen tatsächlich zu erstellen).
ADTC
Mögliches Duplikat von Primärschlüssel entfernen in MySQL
劉鎮 瑲
Ihre Syntax ist vollkommen gültig und jetzt wird Demo
Lukasz Szozda

Antworten:

423

MySQL hat eine spezielle Syntax zum Löschen von Fremdschlüsseleinschränkungen:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
Böhmisch
quelle
21
Postgres, MSSQL und Oracle haben alle alter table .. drop constraint. MySQL ist anscheinend das Ungewöhnliche.
Jared Beck
Es heißt, dass "column2" nicht gelöscht werden kann, da es in einer Fremdschlüsseleinschränkung benötigt wird. Wenn ich tue, was Sie sagen, erhalte ich "Cant DROP column2; überprüfen Sie, ob Spalte / Schlüssel vorhanden ist"
Lealo
Okay, ich habe es verstanden, das Fremde ist eine separate Sache, die nur die Spalte mit anderen Tabellenspalten verbindet. Meins hatte einen Standardnamen. Auch jetzt habe ich jetzt, dass Sie Fremdschlüssel sicher löschen können, ohne dass die Spalte selbst gelöscht wird
Lealo
1
Die Lösung von Wellington Lorindo könnte als korrekter angesehen werden, da durch einfaches Entfernen des Fremdschlüssels der zugehörige Index nicht entfernt wird. Natürlich kann der Index separat erstellt worden sein, aber wenn er als Folge des Hinzufügens des Fremdschlüssels erstellt wurde, wird er nicht einfach durch Löschen des Fremdschlüssels entfernt.
Rich Harding
55

Ich hatte das gleiche Problem und musste es mit diesem Code lösen:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;
Wellington Lorindo
quelle
2
Dies könnte als korrekter angesehen werden als die akzeptierte Lösung, da durch einfaches Entfernen des Fremdschlüssels der Index nicht entfernt wird. Natürlich kann der Index separat erstellt worden sein, aber wenn er als Folge des Hinzufügens des Fremdschlüssels erstellt wurde, wird er nicht einfach durch Löschen des Fremdschlüssels entfernt.
Rich Harding
3
Als ein einziger Befehl: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte
26

Es gibt kein DROP CONSTRAINTMySQL. In Ihrem Fall könnten Sie DROP FOREIGN KEYstattdessen verwenden.

Lothar
quelle
12

Wenn die Einschränkung kein Fremdschlüssel ist, z. Einer, der mit 'UNIQUE CONSTRAINT (colA, colB)' hinzugefügt wurde, ist ein Index, der mit gelöscht werden kannALTER TABLE ... DROP INDEX ...

Robert Knight
quelle
9

Auch schön, Sie können vorübergehend alle Fremdschlüsselprüfungen aus einer MySQL-Datenbank deaktivieren: SET FOREIGN_KEY_CHECKS=0; Und um es wieder zu aktivieren: SET FOREIGN_KEY_CHECKS=1;

Roelleor
quelle
8

Um ein wenig zu Robert Knights Antwort hinzuzufügen, da der Titel des Beitrags selbst keine Fremdschlüssel erwähnt (und da er keine vollständigen Codebeispiele hat und die Kommentarcodeblöcke von SO nicht so gut angezeigt werden wie der Code der Antworten Blöcke), ich werde dies für eindeutige Einschränkungen hinzufügen . Beides funktioniert, um die Einschränkung aufzuheben:

ALTER TABLE `table_name` DROP KEY `uc_name`;

oder

ALTER TABLE `table_name` DROP INDEX `uc_name`;
Spulen
quelle
4

Einige ORMs oder Frameworks verwenden eine andere Namenskonvention für Fremdschlüssel als die Standardkonvention FK_[parent table]_[referenced table]_[referencing field], da sie geändert werden können.

Laravel verwendet zum Beispiel [parent table]_[referencing field]_foreignals Namenskonvention. Mit dieser Abfrage können Sie die Namen der Fremdschlüssel anzeigen, wie hier gezeigt :

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

Entfernen Sie dann den Fremdschlüssel, indem Sie die zuvor erwähnte Abfrage DROP FOREIGN KEY und ihren Eigennamen ausführen.

piscator
quelle
2

Für diejenigen, die mit MariaDB hierher kommen:

Beachten Sie, dass MariaDB DROP CONSTRAINT-Anweisungen im Allgemeinen zulässt, z. B. zum Löschen von Prüfbeschränkungen:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

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

Markus Barthlen
quelle
Ja, dies gilt beispielsweise für Einschränkungen, die sich in derselben Tabelle befinden CONSTRAINT CHECK(a > b). Für Fremdschlüsseleinschränkungen benötigen Sie anscheinend immer noch die DROP FOREIGN KEYSyntax, zumindest in MariaDB Version 10.2
Frank Forte
1
  1. Wechseln Sie zur Strukturansicht der Tabelle
  2. Oben sehen Sie 2 Optionen. A. Tabellenstruktur b. Beziehungsansicht .
  3. Klicken Sie nun auf Beziehungsansicht . Hier können Sie Ihre Fremdschlüsseleinschränkung ablegen. Sie werden alle Beziehung hier bekommen.
Akshay Sharma
quelle
Das ist großartig, hat für mich funktioniert, wenn Sie die ID nicht kennen
Silviu St
0

Es gibt kein DROP CONSTRAINTIn MySql. Dies funktioniert wie Magie in MySQL 5.7

ALTER TABLE answer DROP KEY const_name;
Youness HARDI
quelle
0

Der einfachste Weg, um Einschränkungen zu entfernen, ist die Verwendung ALTER TABLE tbl_name DROP CONSTRAINT symbol;der in MySQL 8.0.19 eingeführten Syntax :

Ab MySQL 8.0.19 ermöglicht ALTER TABLE eine allgemeinere (und SQL-Standard-) Syntax zum Löschen und Ändern vorhandener Einschränkungen eines beliebigen Typs, wobei der Einschränkungstyp aus dem Einschränkungsnamen bestimmt wird

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> Geigen-Demo

Lukasz Szozda
quelle
-4

Dies funktioniert unter MySQL, um Einschränkungen aufzuheben

alter table tablename drop primary key;

alter table tablename drop foreign key;
Ranjitha
quelle
DROP PRIMARY KEYsollte nicht funktionieren. DROP FOREIGN KEYfunktioniert, aber Sie müssen angeben, wem zu drop. Zum BeispielALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre