Một cách nhanh chóng là viết các câu lệnh thay thế của bạn vào một tệp
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';
Sau đó thực thi nội dung của tệp
source /tmp/alter.txt
và bạn đã hoàn thành ...
Đã thử nghiệm nó trong một DB sân chơi và nó hoạt động với tôi, nhưng bạn vẫn có thể muốn kiểm tra lại tệp trước khi thực thi :)
Tái bút:Tôi chưa kiểm tra cách xử lý các giá trị NULL. IIRC bạn phải có giá trị mặc định? Không chắc ngay bây giờ. Vui lòng kiểm tra điều này trước khi sử dụng.
CHỈNH SỬA 1:Để có một câu lệnh cho mỗi bảng:
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
CHỈNH SỬA 2:
Cái này hoạt động
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
, nhưng group_concat()
bị giới hạn về độ dài, vì vậy bạn có thể gặp lỗi cú pháp nếu bạn có quá nhiều cột trong một bảng. Sau đó, bạn vẫn có tùy chọn đầu tiên ở trên, hoặc bạn xem tại mục nhập thủ công này
:
SET [GLOBAL | SESSION] group_concat_max_len = val;