sql >> Base de Datos >  >> RDS >> Mysql

Modifique todas las columnas de una tabla para que sean 'no nulas' pase lo que pase

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;