首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储过程中带有参数的MySQL ALTER

存储过程中带有参数的MySQL ALTER
EN

Stack Overflow用户
提问于 2013-08-14 08:57:30
回答 1查看 1.9K关注 0票数 1

在MySQL迁移脚本中,我试图删除表的所有外键,而不知道约束本身的名称。我需要这样做,因为我只能知道特定数据库安装中的约束名称,但是脚本也必须在其他在当前脚本编码时名称未知的安装中工作。

这是我对存储过程的第一个猜测,但它不起作用。尤其是抱怨“?”在

代码语言:javascript
复制
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的输出是:

代码语言:javascript
复制
@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语句不能使用'?‘因为约束名称不是WHERE子句的一部分,所以不能用位置参数替换它。我不知道的是如何构建一个参数化的ALTER语句。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-14 09:10:36

显而易见的答案:

代码语言:javascript
复制
SET @s = CONCAT('ALTER TABLE `documents` DROP FOREIGN KEY ', @cname);
PREPARE stmtd FROM @s;
EXECUTE stmtd;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18227275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档