Един бърз начин е да напишете своите изрази за промяна във файл
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';
След това изпълнете съдържанието на файла
source /tmp/alter.txt
и сте готови...
Тествах го в база данни на игрална площадка и работи за мен, но все пак може да искате да проверите отново файла, преди да изпълните :)
P.S.:Не съм проверил как се обработват стойностите NULL. IIRC трябва да имате стойност по подразбиране? Не съм сигурен в момента. Моля, тествайте това, преди да го използвате.
РЕДАКТИРАНЕ 1:За да има един израз на таблица:
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
РЕДАКТИРАНЕ 2:
Този работи
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
, но group_concat()
е ограничена по дължина, така че може да получите синтактични грешки, ако имате твърде много колони в таблица. Тогава все още имате първата опция от по-горе или погледнете това ръчно въвеждане
:
SET [GLOBAL | SESSION] group_concat_max_len = val;