Eine schnelle Möglichkeit besteht darin, Ihre Alter-Anweisungen in eine Datei zu schreiben
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';
Führen Sie dann den Inhalt der Datei aus
source /tmp/alter.txt
und fertig...
Ich habe es in einer Playground-DB getestet und es hat bei mir funktioniert, aber vielleicht möchten Sie die Datei vor der Ausführung noch einmal überprüfen :)
P.S.:Ich habe nicht überprüft, wie NULL-Werte behandelt werden. IIRC müssen Sie einen Standardwert haben? Nicht sicher jetzt. Bitte testen Sie dies, bevor Sie es verwenden.
BEARBEITEN 1:Um eine Anweisung pro Tabelle zu haben:
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
BEARBEITEN 2:
Dieser hier funktioniert
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
, aber group_concat()
ist in der Länge begrenzt, sodass Sie möglicherweise Syntaxfehler erhalten, wenn Sie zu viele Spalten in einer Tabelle haben. Dann bleibt dir noch die erste Option von oben, oder du schaust dir dieser manuelle Eintrag
:
SET [GLOBAL | SESSION] group_concat_max_len = val;