Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
altertable脚本中的MySQL变量_Mysql_Stored Procedures_Constraints_Alter Table - Fatal编程技术网

altertable脚本中的MySQL变量

altertable脚本中的MySQL变量,mysql,stored-procedures,constraints,alter-table,Mysql,Stored Procedures,Constraints,Alter Table,您好,以下过程将不得不将所有约束从一个表移动到另一个表,但是我在删除约束时遇到了一些困难 问题是:如何在下面的行中使用变量 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不

您好,以下过程将不得不将所有约束从一个表移动到另一个表,但是我在删除约束时遇到了一些困难

问题是:如何在下面的行中使用变量

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\u引用的\u表\u名称
var\u约束\u名称
识别为变量

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();

提前感谢。

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

这可以通过两种方式完成,一种是通过
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;

我得到“您的SQL语法有错误;请检查与您的MySQL服务器版本相对应的手册,以获得在第1行“?DROP FOREIGN KEY?”附近使用的正确语法”@MichaelIrey您可能想在该网站上就此提出一个新问题;实际上,从评论上看,这似乎不是什么可以回答的问题;-)第二个选项不起作用,因为占位符只能在允许使用表达式的情况下使用,而不能代替表名或列名。第二种方法确实不能像@MichaelIrey指出的那样起作用。我没有投反对票,只是因为选项一非常有效!