2012-02-28 2 views
1

J'essaie de supprimer une clé étrangère d'une table référençant une table spécifiée. Je ne connais pas le nom de la clé étrangère, je ne connais que la table dans laquelle elle se trouve et la table qu'elle référence. Voilà ce que je suis arrivé à ce jour:Comment supprimer dynamiquement une clé étrangère de la table MySQL?

alter table tblTableWhereFKIs drop foreign key (select constraint_name 
from information_schema.key_column_usage 
where referenced_table_name = 'tblReferencedByFK' and table_name = 'tblTableWhereFKIs' limit 1); 

Mais je reçois une erreur:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(select constraint_name 
from information_schema.key_column_usage 
where referen' at line 1 

Les travaux de sélection seul:

mysql> select constraint_name 
    -> from information_schema.key_column_usage 
    -> where referenced_table_name = 'tblReferencedByFK' and table_name = 'tblTableWhereFKIs' limit 1; 
+-----------------------------------------+ 
| constraint_name       | 
+-----------------------------------------+ 
| fk_tblTableWhereFKIs_tblReferencedByFK1 | 
+-----------------------------------------+ 
1 row in set (0.08 sec) 

Répondre

2

Je ne crois pas que vous pouvez le faire. L'instruction alter ne sait pas comment extrapoler les résultats de votre select en plusieurs exécutions de drop foreign key.

je fais quelque chose comme ceci:

SELECT CONCAT('alter table ', table_name, ' drop foreign key ', constraint_name, ';') 
FROM information_schema.key_column_usage 
WHERE referenced_table_name = 'tblReferencedByFK' and table_name = 'tblTableWhereFKIs'; 

J'exécute la requête ci-dessus qui construira toutes les déclarations alter pour moi. Je prends alors cette liste d'instructions de modification et les exécute manuellement.

1

Je n'ai pas mySQL à la main ne peut donc pas tester, mais je pense que quelque chose le long des lignes de ce qui suit fonctionnera:

DECLARE @SQL VARCHAR(100) 

SELECT @SQL = 'alter table tblTableWhereFKIs drop foreign key ' + constraint_name 
FROM information_schema.key_column_usage 
WHERE referenced_table_name = 'tblReferencedByFK' 
AND  table_name = 'tblTableWhereFKIs' 

PREPARE stmt FROM @SQL 
EXECUTE stmt 

Mon expérience de MySQL est limité, c'est un mélange de votre réponse et des informations du MySQL Website

Questions connexes