Comment supprimer les contraintes de ma table MySQL?

252

Je souhaite supprimer les contraintes de ma table. Ma requête est:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Mais j'ai une erreur:

#1064- Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de «contrainte FK_tbl_magazine_issue_mst_users» à la ligne 1

deepu sankar
la source
1
Il convient de noter que si vous avez créé une CHECKcontrainte, il n'est pas nécessaire de la supprimer car aucune contrainte réelle n'est créée. Vous pouvez sélectionner de information_schema.table_constraintspour vérifier, et vous pouvez même exécuter encore add constraintet encore sans erreur. MySQL ne prend pas en charge les CHECKcontraintes mais autorise le SQL destiné à les créer (sans réellement créer les contraintes).
ADTC
Duplication possible de la suppression de la clé primaire dans MySQL
瑲 瑲
Votre syntaxe est parfaitement valide et maintenant elle est prise en charge démo
Lukasz Szozda

Réponses:

423

Mysql a une syntaxe spéciale pour supprimer les contraintes de clé étrangère:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
Bohème
la source
21
Postgres, MSSQL et Oracle l'ont tous alter table .. drop constraint. MySQL est l'intrus, semble-t-il.
Jared Beck
Il dit qu'il ne peut pas supprimer les beacuses "column2", il est nécessaire dans une contrainte de clé étrangère. Quand je fais ce que vous dites, je reçois "Cant DROP column2; vérifiez que la colonne / clé existe"
Lealo
D'accord, je l'ai compris, l'étranger est une chose distincte, il suffit de connecter la colonne à d'autres colonnes de tables. Le mien avait un nom standard. Aussi maintenant je maintenant que vous pouvez supprimer des clés étrangères en toute sécurité sans que la colonne elle-même ne soit supprimée
Lealo
1
La solution de Wellington Lorindo pourrait être considérée comme plus correcte, car la simple suppression de la clé étrangère ne supprimera pas l'index associé. Bien sûr, l'index peut avoir été créé séparément, mais s'il a été créé à la suite de l'ajout de la clé étrangère en premier lieu, il ne sera pas supprimé simplement en supprimant la clé étrangère.
Rich Harding
55

J'ai eu le même problème et j'ai pu résoudre ce code:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;
Wellington Lorindo
la source
2
Cela pourrait être considéré comme plus correct que la solution acceptée, car la simple suppression de la clé étrangère ne supprimera pas l'index. Bien sûr, l'index peut avoir été créé séparément, mais s'il a été créé à la suite de l'ajout de la clé étrangère en premier lieu, il ne sera pas supprimé simplement en supprimant la clé étrangère.
Rich Harding
3
En une seule commande: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte
26

Il n'y a rien de tel que DROP CONSTRAINTdans MySQL. Dans votre cas, vous pouvez utiliser à la DROP FOREIGN KEYplace.

Lothar
la source
12

Si la contrainte n'est pas une clé étrangère, par exemple. on a ajouté en utilisant 'UNIQUE CONSTRAINT (colA, colB)' alors c'est un index qui peut être supprimé en utilisantALTER TABLE ... DROP INDEX ...

Robert Knight
la source
9

Aussi bien, vous pouvez désactiver temporairement toutes les vérifications de clés étrangères à partir d'une base de données mysql: SET FOREIGN_KEY_CHECKS=0; Et pour le réactiver: SET FOREIGN_KEY_CHECKS=1;

roelleor
la source
8

Pour ajouter un peu à la réponse de Robert Knight, puisque le titre du message lui-même ne mentionne pas de clés étrangères (et puisque son n'a pas d'échantillons de code complets et que les blocs de code de commentaire de SO ne s'affichent pas aussi bien que le code des réponses blocs), je vais ajouter ceci pour des contraintes uniques . L'un ou l'autre de ces travaux supprime la contrainte:

ALTER TABLE `table_name` DROP KEY `uc_name`;

ou

ALTER TABLE `table_name` DROP INDEX `uc_name`;
jbobbins
la source
4

Certains ORM ou frameworks utilisent une convention de dénomination pour les clés étrangères différente de la valeur par défaut FK_[parent table]_[referenced table]_[referencing field], car ils peuvent être modifiés.

Laravel par exemple utilise [parent table]_[referencing field]_foreigncomme convention de dénomination. Vous pouvez afficher les noms des clés étrangères à l'aide de cette requête, comme illustré ici :

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

Supprimez ensuite la clé étrangère en exécutant la requête DROP FOREIGN KEY mentionnée précédemment et son nom correct.

piscator
la source
2

Pour ceux qui viennent ici en utilisant MariaDB:

Notez que MariaDB autorise les instructions DROP CONSTRAINT en général, par exemple pour supprimer les contraintes de vérification:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

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

Markus Barthlen
la source
Oui, c'est pour les contraintes qui sont dans la même table, par exemple CONSTRAINT CHECK(a > b). Pour les contraintes de clé étrangère, il semble que vous ayez toujours besoin de la DROP FOREIGN KEYsyntaxe, au moins dans MariaDB version 10.2
Frank Forte
1
  1. Aller à la vue structure de la table
  2. Vous verrez 2 options en haut a. Structure du tableau b. Vue Relation .
  3. Maintenant, cliquez sur la vue Relation , ici vous pouvez supprimer votre contrainte de clé étrangère. Vous obtiendrez toute relation ici.
Akshay Sharma
la source
C'est super, ça a fonctionné pour moi quand tu ne connais pas l'id
Silviu St
0

Il n'y a pas DROP CONSTRAINTdans MySql. Cela fonctionne comme par magie dans mysql 5.7

ALTER TABLE answer DROP KEY const_name;
Youness HARDI
la source
0

La façon la plus simple de supprimer la contrainte est d'utiliser la syntaxe ALTER TABLE tbl_name DROP CONSTRAINT symbol;introduite dans MySQL 8.0.19 :

Depuis MySQL 8.0.19, ALTER TABLE permet une syntaxe plus générale (et standard SQL) pour supprimer et modifier les contraintes existantes de tout type, où le type de contrainte est déterminé à partir du nom de la contrainte

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

démo db <> fiddle

Lukasz Szozda
la source
-4

cela fonctionnera sur MySQL pour supprimer les contraintes

alter table tablename drop primary key;

alter table tablename drop foreign key;
Ranjitha
la source
DROP PRIMARY KEYne devrait pas fonctionner. DROP FOREIGN KEYfonctionne mais vous devez spécifier à qui drop. Par exempleALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre