Mysql
 sql >> Database >  >> RDS >> Mysql

Modifica tutte le colonne in una tabella su "non null", qualunque cosa accada

Un modo rapido è scrivere le tue dichiarazioni alter in un file

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';

Quindi esegui il contenuto del file

source /tmp/alter.txt

e il gioco è fatto...

L'ho testato in un DB playground e ha funzionato per me, tuttavia potresti voler ricontrollare il file prima di eseguirlo :)

PS:non ho verificato come vengono gestiti i valori NULL. IIRC devi avere un valore predefinito? Non sono sicuro in questo momento. Si prega di testarlo prima di usarlo.

EDIT 1:per avere un'istruzione per tabella:

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

EDIT 2:

Questo funziona

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

, ma group_concat() è di lunghezza limitata, quindi potresti ricevere errori di sintassi se hai troppe colonne in una tabella. Quindi hai ancora la prima opzione dall'alto, oppure dai un'occhiata a questo inserimento manuale :

SET [GLOBAL | SESSION] group_concat_max_len = val;