我正在运行一个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)列?
亲切的问候, 烫发
答案 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
语句更改单个表中的所有列,但这种努力可能不值得。