2012-07-27 90 views
3

Hello以下过程将不得不将所有约束从一个表移动到另一个表,但是我在约束被删除处遇到了一些困难。ALTER TABLE脚本中的MySQL变量

问题:我怎么使用变量在以下行

ALTER TABLE var_referenced_table_name DROP FOREIGN KEY var_constraint_name; 

当我使用的是,我收到以下错误

Error Code: 1146. Table 'oaf_businesslink_dev.var_referenced_table_name' doesn't exist 

MySQL不承认var_referenced_table_namevar_constraint_name作为变量。

DELIMITER // 
DROP PROCEDURE IF EXISTS AlterConstraints// 
CREATE PROCEDURE AlterConstraints() 
BEGIN 

    DECLARE schema_name VARCHAR(60) DEFAULT 'oaf_businesslink_dev'; 
    DECLARE table_name VARCHAR(60) DEFAULT 'wp_systemuser'; 

    DECLARE finished INTEGER DEFAULT 0; 
    DECLARE total INTEGER DEFAULT 0;  

    DECLARE var_constraint_name VARCHAR(60) DEFAULT ''; 
    DECLARE var_table_name VARCHAR(60) DEFAULT ''; 
    DECLARE var_column_name VARCHAR(60) DEFAULT ''; 
    DECLARE var_referenced_table_name VARCHAR(60) DEFAULT ''; 
    DECLARE var_referenced_column_name VARCHAR(60) DEFAULT ''; 

    DECLARE cur_constraints CURSOR FOR SELECT constraint_Name, table_name,column_name,referenced_table_name,referenced_column_name 
    FROM information_schema.key_column_usage 
    WHERE constraint_schema = schema_name 
     AND referenced_table_name = table_name 
     AND table_name IS NOT NULL; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; 
    OPEN cur_constraints; 

    get_constraint: 
    LOOP FETCH cur_constraints 
    INTO var_constraint_name 
     ,var_table_name 
     ,var_column_name 
     ,var_referenced_table_name 
     ,var_referenced_column_name;   

     IF finished THEN 
      LEAVE get_constraint; 
     END IF; 

     /* Get Constraint Count */ 
     SET total = total + 1; 

     /* Remove Constraint */ 
     IF EXISTS(SELECT * FROM information_schema.TABLE_CONSTRAINTS 
      WHERE CONSTRAINT_NAME = var_constraint_name AND TABLE_NAME = var_referenced_table_name AND TABLE_SCHEMA = schema_name) 
      THEN 
      /* 
      * Error Code: 1146. Table 'oaf_businesslink_dev.var_referenced_table_name' doesn't exist 
      */ 
      ALTER TABLE var_referenced_table_name DROP FOREIGN KEY var_constraint_name; 
     END IF; 

     /* Change Datatype to BIGINT */ 

     /* Recreate Constraint to new table */ 
    END 

    LOOP get_constraint; 
    CLOSE cur_constraints; 
    SELECT total; 

END 
// 
DELIMITER ; 

CALL AlterConstraints(); 

在此先感谢。

回答

8

通过使用变量作为列名和表格,最好将DECLARE查询作为“字符串”,然后通过Prepared Statement执行该字符串。

这可以通过两种方式来实现,或者通过CONCAT()打造完整的字符串或使用PREPARE与参数:

SET @query = CONCAT('ALTER TABLE ', var_referenced_table_name, ' DROP FOREIGN KEY ', var_constraint_name, ';'); 
PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

谢谢newfurniturey :) – ex0b1t 2012-07-27 13:08:27

+0

没问题!很高兴它的工作=] – newfurniturey 2012-07-27 13:09:17

+0

我得到“你的SQL语法有错误;查看与你的MySQL服务器版本相对应的手册,在正确的语法附近使用'?DROP FOREIGN KEY?'。在第1行“ – 2013-09-26 19:10:23