Uma maneira rápida é escrever suas instruções alter em um arquivo
select
concat('ALTER TABLE ', c.TABLE_NAME, ' CHANGE ', c.COLUMN_NAME, ' ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL;') as alter_statement
into outfile '/tmp/alter.txt'
from information_schema.COLUMNS c
where
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'your_database_name';
Em seguida, execute o conteúdo do arquivo
source /tmp/alter.txt
e pronto...
Testei em um banco de dados de playground e funcionou para mim, ainda assim você pode verificar o arquivo antes de executar :)
P.S.:Eu não verifiquei como os valores NULL são tratados. IIRC você tem que ter um valor padrão? Não tenho certeza agora. Por favor, teste isso antes de usá-lo.
EDIT 1:Para ter uma instrução por tabela:
select
concat('ALTER TABLE ', c.TABLE_NAME, GROUP_CONCAT(' MODIFY COLUMN ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL')) as alter_statement
from information_schema.COLUMNS c
where
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'your_database_name'
group by c.TABLE_NAME
EDIÇÃO 2:
Este funciona
select concat(alter_statement, ';')
into outfile '/tmp/alter.txt'
from (
select
concat('ALTER TABLE ', c.TABLE_NAME, GROUP_CONCAT(' CHANGE ', c.COLUMN_NAME, ' ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL')) as alter_statement
from information_schema.COLUMNS c
where
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'playground'
group by c.TABLE_NAME
) sq
, mas
group_concat()
é limitado em tamanho, portanto, você pode obter erros de sintaxe se tiver muitas colunas em uma tabela. Então você ainda tem a primeira opção acima, ou dê uma olhada em esta entrada manual
:SET [GLOBAL | SESSION] group_concat_max_len = val;