MySQL ALTER TABLE 在存储过程中带有参数

标签 mysql parameters alter

在 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;

关于MySQL ALTER TABLE 在存储过程中带有参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18227275/

相关文章:

mysql - 更改 MySQL SHOW COLUMN "Extra"值

mysql - 更改表以在特定列之前添加列

mysql - ALTER TABLE ALL TABLES ROW_FORMAT=固定;

javascript - 如何将标签映射到标签同义词?

Javascript 网址管理

mysql - 使用sql对多个字段进行分组

java - 了解 Java 在用作方法参数时如何处理对象

Jquery 函数中可用的 Javascript 参数

PHP 和十六进制值

python - MySQLdb : how to connect with phpMyAdmin