1

MySQL 移行スクリプトで、制約自体の名前を知らずに、テーブルのすべての外部キーを削除しようとしています。特定のデータベース インストールでしか制約名を認識できないため、これが必要ですが、スクリプトは、現在のスクリプトのコーディング時に名前が不明な他のインストールでも機能する必要があります。

これがストアド プロシージャの最初の推測ですが、うまくいきません。特に、「?」について文句を言います。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;

MySQL の出力は次のとおりです。

@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

これで、文句を言う理由が想像できます。ALTER TABLE ステートメントでは「?」を使用できません。制約名は WHERE 句の一部ではないため、位置パラメーターで置き換えることはできません。私が知らないのは、パラメーター化された ALTER TABLE ステートメントを作成する方法です。

4

1 に答える 1

4

明白な答え:

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

くだらない質問ですみません…

于 2013-08-14T09:10:36.323 に答える