更改列名的动态过程

Posted

技术标签:

【中文标题】更改列名的动态过程【英文标题】:Dynamic procedure to change Column name 【发布时间】:2018-06-05 01:28:46 【问题描述】:

我需要创建一个动态过程,以便每当我需要重命名表的列时,我都会传递所需的参数,并且它可以正确执行。所以IF的验证。

这段代码产生的错误如下:

您的 SQL 语法有错误;检查手册 对应于您的 mysql 服务器版本,以便使用正确的语法 'IF EXISTS (SELECT * FROM information_schema.columns WHERE 第 1 行的 table_name = 'People''

DROP PROCEDURE IF EXISTS `change_column_name`;

DELIMITER ;;
CREATE PROCEDURE `change_column_name`(IN tableName VARCHAR(100), IN columnName VARCHAR(100), IN newColumnName VARCHAR(100), IN columnType VARCHAR(20), IN defaultValue VARCHAR(100))
BEGIN
    SET @query = CONCAT('IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = \'', tableName, '\' AND column_name = \'', columnName, '\') THEN
                                ALTER TABLE \'', tableName, '\' CHANGE COLUMN \'', columnName, '\' \'', newColumnName, '\' ', columnType, ' DEFAULT ', defaultValue, ';
                        END IF;');

    PREPARE stmt1 FROM @query;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
END ;;
DELIMITER ;

CALL `change_column_name`('People', 'Nme', 'Name', 'VARCHAR(50)', 'NULL');

【问题讨论】:

iF EXISTS(SELECT .... 是 SQL 服务器语法 @RaymondNijland Nop。如果您保留相同的代码并删除参数,请将所有内容更改为硬编码即可。 你使用concat函数的方式是对它进行SQL server语法搜索 @RaymondNijland 好的,那为什么删除参数并保持硬编码会起作用? 不要相信生成的字符串变量@qeury 仅包含无效的 MySQL 语法。您需要将 SELECT 和 ALTER 表查询分开才能在 MySQL 中工作。我现在不能写答案,因为我现在正在打电话 【参考方案1】:

已解决,步骤的方式不对。

DROP PROCEDURE IF EXISTS `change_column_name`;

DELIMITER ;;
CREATE PROCEDURE `change_column_name`(IN tableName VARCHAR(100), IN columnName VARCHAR(100), IN newColumnName VARCHAR(100), IN columnType VARCHAR(20), IN defaultValue VARCHAR(100))
BEGIN
    IF EXISTS (SELECT * FROM information_schema.COLUMNS WHERE table_name = tableName AND column_name = columnName) THEN
        SET @query = CONCAT('ALTER TABLE `', tableName, '` CHANGE COLUMN `', columnName, '` `', newColumnName, '` ', columnType, ' DEFAULT ', defaultValue, ';');
        PREPARE stmt1 FROM @query;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;    
END ;;
DELIMITER ;

CALL `change_column_name`('People', 'Nme', 'Name', 'VARCHAR(50)', 'NULL');

【讨论】:

以上是关于更改列名的动态过程的主要内容,如果未能解决你的问题,请参考以下文章

mySQL 使用动态列名的过程更新行

使用 Laravel,您可以在迁移过程中更改列名吗?

以列名作为输入参数的存储过程中的动态 sql

当我们在 plsql 中动态传递列名的值和相应的列值时获取整行的存储过程

SQL:根据变量选择动态列名

从动态表中选择时更改列名