MySQL在创建表时替换列类型

MySQL在创建表时替换列类型,mysql,column-types,Mysql,Column Types,我正在运行一个MySQL服务器,一切都很好,但现在我有一个应用程序在运行,它时不时地创建表 应用程序正在创建表,其中一个(或多个)列被定义为tinyint(3)。出于遗留目的,我希望将这些表定义为smallint(5) 作为一种解决方法,我现在每分钟运行一个脚本,用smallint(5)列替换tinyint(3)列的单个实例 缺点之一是该脚本一次只修改一个列,如果没有tinyint列,则会产生错误 有没有更优雅的方法用smallint(5)列替换tinyint(3)列 致以亲切的问候, Marc

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

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

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

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

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

致以亲切的问候,
Marcel

您至少可以修复错误:

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;
set@a:='';
选择@a:=CONCAT('ALTER TABLE myDatabase.`',TABLE_name','CHANGE`',column_name','`',',
列名称,`SMALLINT(5)UNSIGNED NOT NULL;')qry
从信息_schema.columns
其中表_schema='myDatabase'
和列类型,如“%tinyint%”
按表格名称、序号位置排序
限值1;
如果@a“
然后
从@a准备stmt;
执行stmt;
如果结束;

再多做一点工作,您就可以用一个
alter
语句更改一个表中的所有列,但这可能不值得。

如何更改创建表的代码?恐怕我无法访问应用程序的源代码。您想为哪些“遗留用途”服务?我问的原因是,在您没有源代码的正在运行的应用程序下更改表示很可能会导致/发现该第三方应用程序中的错误。自一个月前启用此脚本以来,我们尚未发现任何问题。应用程序记录更改,在普通环境中,更改ID不超过250,但在修改后的环境中,更改ID超过9000,很快就会达到10000。谢谢,这确实解决了部分问题。现在不需要一次替换所有列,因为这只是一个时不时的问题,我们可以在创建表后等待3分钟。我在等着看是否有人能回答问题的触发部分,在那里它会自动执行。如果没有,我会把你的帖子标记为答案。
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;