[英]MySQL ALTER TABLE with arguments in stored procedure
在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語句。
明顯的答案:
SET @s = CONCAT('ALTER TABLE `documents` DROP FOREIGN KEY ', @cname);
PREPARE stmtd FROM @s;
EXECUTE stmtd;
對不起這個愚蠢的問題......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.