Cara cepat adalah dengan menulis pernyataan perubahan Anda ke dalam file
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';
Kemudian jalankan konten file
source /tmp/alter.txt
dan selesai...
Mengujinya di DB taman bermain dan berhasil untuk saya, Anda mungkin masih ingin memeriksa ulang file sebelum menjalankan :)
P.S .:Saya belum memeriksa bagaimana nilai NULL ditangani. IIRC Anda harus memiliki nilai default? Tidak yakin sekarang. Silakan uji ini sebelum menggunakannya.
EDIT 1:Untuk memiliki satu pernyataan per 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
EDIT 2:
Yang ini berfungsi
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
, tetapi group_concat()
panjangnya terbatas, jadi Anda mungkin mendapatkan kesalahan sintaks jika Anda memiliki terlalu banyak kolom dalam sebuah tabel. Kemudian Anda masih memiliki opsi pertama dari atas, atau lihat entri manual ini
:
SET [GLOBAL | SESSION] group_concat_max_len = val;