2017-02-08 2 views
0

Мы начали с ID как int (11). Затем мы переключились на генерацию столбца Hibernate, и идентификатор стал bigint (20). Таким образом, многие внешние ключи перестали работать, если я не изменил определение столбца соединения от bigint (20) до int (11). Можно ли написать скрипт, который изменяет все int (11) на bigint (20) для всех столбцов?Как изменить тип данных для многих столбцов сразу в MYSQL?

Запрос найти все столбцы изменить следующим образом:

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 или я должен написать альтер сценарий для каждой таблицы?

+0

Вы имеете в виду создавать инструкции 'alter table'? Вы можете проверить [** информационную схему **] (http://stackoverflow.com/questions/1526688/get-table-column-names-in-mysql) и создать динамический запрос. –

+0

Вот что я подумал, как? –

+0

Но в чем проблема? Запросить информационную схему или создать динамический запрос. Расскажите, пожалуйста, больше, чтобы вести вас в правильном направлении. –

ответ

2

Вы можете запросить INFORMATION_SCHEMA для динамического создания сценария с помощью операторов ALTER TABLE, необходимых для изменения этих типов данных столбцов.

Вы должны быть очень осторожны, чтобы изменить тип данных, а не любые другие атрибуты столбца (nullability, auto_increment, signed/unsigned и т. Д.).

Вот пример, чтобы вы начали. Это будет генерировать один оператор 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; 
+0

Спасибо, получив ошибку errno: 150 - неверно сформировано ограничение внешнего ключа. –

+0

Перед изменением типов данных вам необходимо удалить внешние ключи, а затем снова добавить их. –

+0

Да, это то, что я сделал, Hibernate создает внешние ключи в любом случае –

 Смежные вопросы

  • Нет связанных вопросов^_^