MySQL在表创建时替换列类型

时间:2013-08-14 10:27:56

标签: mysql column-types

我正在运行一个MySQL服务器,一切都很好,但是现在我正在运行一个不时创建表的应用程序。

应用程序正在创建一个表,其中一个(或多个)列被定义为tinyint(3)。出于传统目的,我希望将这些表定义为smallint(5)。

作为一种解决方法我现在每分钟运行一个脚本,用smallint(5)列替换tinyint(3)列的单个实例。

    select @a := CONCAT('ALTER TABLE myDatabase.`', table_name, '` CHANGE `', column_name, '` `', column_name, '` SMALLINT( 5 ) UNSIGNED NOT NULL;') qry from information_schema.columns
    where table_schema = 'myDatabase'
      and column_type like '%tinyint%'
    order by table_name,ordinal_position
    ;
    PREPARE stmt FROM @a;
    EXECUTE stmt;

其中一个缺点是此脚本一次只修改一个列,如果没有tinyint列则会产生错误。

有没有更优雅的方法用smallint(5)列替换tinyint(3)列?

亲切的问候, 烫发

1 个答案:

答案 0 :(得分:0)

您至少可以修复错误:

set @a := '';
select @a := CONCAT('ALTER TABLE myDatabase.`', table_name, '` CHANGE `', column_name, '` `', 
                     column_name, '` SMALLINT( 5 ) UNSIGNED NOT NULL;') qry
from information_schema.columns
where table_schema = 'myDatabase'
  and column_type like '%tinyint%'
order by table_name, ordinal_position
limit 1;

if @a <> ''
then
    PREPARE stmt FROM @a;
    EXECUTE stmt;
end if;

通过更多工作,您可以使用一个alter语句更改单个表中的所有列,但这种努力可能不值得。