एक त्वरित तरीका यह है कि आप अपने परिवर्तन विवरण को एक फ़ाइल में लिख लें
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
और आपका काम हो गया...
एक खेल के मैदान डीबी में इसका परीक्षण किया और यह मेरे लिए काम किया, फिर भी आप निष्पादित करने से पहले फ़ाइल को दोबारा जांचना चाहेंगे :)
पीएस .:मैंने जांच नहीं की है कि कैसे NULL मानों को संभाला जाता है। आईआईआरसी आपके पास डिफ़ॉल्ट मान होना चाहिए? अभी यकीन नहीं हो रहा। कृपया इसका उपयोग करने से पहले इसका परीक्षण करें।
संपादित करें 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;