Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Modifique todas as colunas em uma tabela para 'não nula', não importa o que


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;