2013-08-14 3 views
1

Dans un script de migration MySQL, j'essaie de supprimer toutes les clés étrangères d'une table sans connaître le nom des contraintes elles-mêmes. J'en ai besoin car je ne connais que les noms des contraintes dans une installation de base de données particulière, mais le script doit aussi fonctionner dans d'autres installations où le nom est inconnu au moment du codage du script.MySQL ALTER TABLE avec des arguments dans la procédure stockée

Voici ma première estimation d'une procédure stockée, mais cela ne fonctionne pas. En particulier, il se plaint du «? dans ALTER TABLE.

DELIMITER $$ 

DROP PROCEDURE IF EXISTS drop_foreign_key_documents $$ 
CREATE PROCEDURE drop_foreign_key_documents () 
BEGIN 
WHILE (SELECT COUNT(*) AS index_exists FROM `information_schema`.`TABLE_CONSTRAINTS` c WHERE `c`.`CONSTRAINT_TYPE` LIKE '%FOREIGN%' AND `c`.`TABLE_NAME`='documents' and `c`.`TABLE_SCHEMA`='mydb') > 0 DO 
    SET @ctype = '%FOREIGN%'; 
    SET @tname = 'documents'; 
    SET @dbname = 'mydb'; 
    SET @n = 'select `CONSTRAINT_NAME` INTO @cname FROM `information_schema`.`TABLE_CONSTRAINTS` c WHERE `c`.`CONSTRAINT_TYPE` LIKE ? AND `c`.`TABLE_NAME`=? and `c`.`TABLE_SCHEMA`=? LIMIT 0,1'; 
    PREPARE stmt FROM @n; 
    EXECUTE stmt USING @ctype,@tname,@dbname; 
    SELECT @cname; 

    SET @s = 'ALTER TABLE `documents` DROP FOREIGN KEY ?'; 
    PREPARE stmtd FROM @s; 
    EXECUTE stmtd USING @cname; 
END WHILE; 
END $$ 

DELIMITER ; 

CALL drop_foreign_key_documents; 

La sortie de MySQL est:

@cname 
documents_ibfk_13 
ERROR 1064 (42000) at line 23: 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 '?' at line 1 

Maintenant, je peux imaginer pourquoi il se plaint: «? L'instruction ALTER TABLE ne peut pas utiliser car le nom de la contrainte ne fait pas partie d'une clause WHERE et ne peut donc pas être remplacé par un paramètre positionnel. Ce que je ne sais pas, c'est comment construire une instruction ALTER TABLE paramétrée.

Répondre

3

réponse évidente:

SET @s = CONCAT('ALTER TABLE `documents` DROP FOREIGN KEY ', @cname); 
PREPARE stmtd FROM @s; 
EXECUTE stmtd; 

Désolé pour la question stupide ...

+0

Je pense que les questions qui montrent l'effort de recherche sont toujours les bienvenus. Merci pour le partage. – RandomSeed

Questions connexes