手っ取り早い方法は、alterステートメントをファイルに書き込むことです
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
完了です...
プレイグラウンドDBでテストしたところ、うまくいきましたが、実行する前にファイルを再確認することをお勧めします:)
追伸:NULL値の処理方法を確認していません。 IIRCデフォルト値が必要ですか?今はわかりません。使用する前にこれをテストしてください。
編集1:テーブルごとに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;