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


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



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

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`;

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.


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 ...


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;


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`;

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.


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/


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.

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;

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


-4

cela fonctionnera sur MySQL pour supprimer les contraintes

alter table tablename drop primary key;

alter table tablename drop foreign key;

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.