Una forma rápida es escribir sus declaraciones de modificación en un archivo
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';
Luego ejecute el contenido del archivo
source /tmp/alter.txt
y listo...
Lo probé en una base de datos del patio de recreo y funcionó para mí, aún así es posible que desee volver a verificar el archivo antes de ejecutarlo :)
PD:No he comprobado cómo se manejan los valores NULL. IIRC tienes que tener un valor por defecto? No estoy seguro en este momento. Pruébelo antes de usarlo.
EDITAR 1:Para tener una declaración por tabla:
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
EDICIÓN 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
, pero group_concat()
tiene una longitud limitada, por lo que es posible que obtenga errores de sintaxis si tiene demasiadas columnas en una tabla. Entonces todavía tiene la primera opción de arriba, o echa un vistazo a esta entrada manual
:
SET [GLOBAL | SESSION] group_concat_max_len = val;