Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ändern Sie alle Spalten in einer Tabelle auf "nicht null", egal was passiert

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;