0

我正在运行一个 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) 列吗?

亲切的问候, 马塞尔

4

1 回答 1

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语句更改单个表中的所有列,但这种努力可能不值得。

于 2013-08-14T10:37:12.340 回答