我们开始使用ID作为int(11)。然后我们切换到Hibernate列自动生成,ID变为bigint(20)。因此,除非我将连接列定义从bigint(20)更改为int(11),否则许多外键都停止工作。是否可以编写一个脚本,将所有列的int(11)更改为bigint(20)?
查找要更改的所有列的查询如下:
select table_name, column_name, column_type
from information_schema.columns
where table_schema = 'rentoptimum'
and column_type='int(11)'
order by table_name, ordinal_position;
我可以更新information_schema.columns中的数据,还是应该为每个表编写alter脚本?
答案 0 :(得分:2)
您可以查询INFORMATION_SCHEMA
以动态生成包含修改这些列数据类型所需的ALTER TABLE
语句的脚本。
您需要非常小心地仅修改数据类型,而不是列的任何其他属性(可空性,auto_increment,有符号/无符号等)。
这是一个让你入门的例子。这将在给定模式中为每个表生成一个ALTER TABLE
语句,即使它有多个要修改的列。它会将int(11)
替换为bigint(11)
,这与您要求的略有不同,但(11)
不会影响实际的数据类型。你可以根据需要进行调整。
select concat('alter table `',t.table_schema,'`.`',t.table_name,'`',
group_concat(' modify column `',c.column_name,'` ',replace(c.column_type,'int','bigint'),
if(c.is_nullable='yes',' null',' not null '),c.extra),';') as the_ddl
into outfile '/tmp/so42114820.sql'
from information_schema.columns c
inner join information_schema.tables t on t.table_schema = c.table_schema and t.table_name = c.table_name
where t.table_schema = 'your_schema'
and t.table_type = 'BASE TABLE'
and c.data_type = 'int'
group by t.table_schema,t.table_name;
set @foreign_key_checks = @@foreign_key_checks;
set foreign_key_checks = 0;
\. /tmp/so42114820.sql
set foreign_key_checks = @foreign_key_checks;