Szybkim sposobem jest zapisanie instrukcji alter w pliku
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';
Następnie uruchom zawartość pliku
source /tmp/alter.txt
i gotowe...
Przetestowałem to w bazie danych placu zabaw i zadziałało dla mnie, ale nadal możesz chcieć dwukrotnie sprawdzić plik przed uruchomieniem :)
P.S.:Nie sprawdziłem, jak obsługiwane są wartości NULL. IIRC musisz mieć domyślną wartość? Nie jestem teraz pewien. Przetestuj to przed użyciem.
EDYCJA 1:Aby mieć jedną instrukcję na tabelę:
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
EDYCJA 2:
Ten działa
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
, ale group_concat()
ma ograniczoną długość, więc jeśli w tabeli jest zbyt wiele kolumn, mogą wystąpić błędy składni. Wtedy nadal masz pierwszą opcję z góry lub spójrz na ten wpis ręczny
:
SET [GLOBAL | SESSION] group_concat_max_len = val;