Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

अन्य मेटाडेटा खोए बिना MySQL में कॉलम डेटा प्रकार बदलें (DEFAULT, NOTNULL...)

जैसा कि मैन्युअल पेज में बताया गया है , ALTER TABLE सभी नए प्रकार की विशेषताओं को परिभाषित करने की आवश्यकता है।

हालाँकि, इससे उबरने का एक तरीका है। आप INFORMATION_SCHEMA का इस्तेमाल कर सकते हैं मेटा-डेटा वांछित ALTER . का पुनर्निर्माण करने के लिए सवाल। उदाहरण के लिए, यदि हमारे पास साधारण तालिका है:

mysql> DESCRIBE t;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| value | varchar(255)     | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

तब हम अपने परिवर्तन कथन को इसके साथ पुन:पेश कर सकते हैं:

SELECT 
  CONCAT(
    COLUMN_NAME, 
    ' @new_type', 
    IF(IS_NULLABLE='NO', ' NOT NULL ', ' '), 
    EXTRA
  ) AS s
FROM 
  INFORMATION_SCHEMA.COLUMNS 
WHERE 
  TABLE_SCHEMA='test' 
  AND 
  TABLE_NAME='t'

परिणाम होगा:

+--------------------------------------+
| s                                    |
+--------------------------------------+
| id @new_type NOT NULL auto_increment |
| value @new_type NOT NULL             |
+--------------------------------------+

यहाँ मैंने @new_type छोड़ दिया है यह इंगित करने के लिए कि हम उसके लिए चर का उपयोग कर सकते हैं (या हमारे नए प्रकार को सीधे क्वेरी में बदल सकते हैं)। वेरिएबल के साथ जो होगा:

  • हमारे चर सेट करें।

    mysql> SET @new_type := 'VARCHAR(10)', @column_name := 'value';
    Query OK, 0 rows affected (0.00 sec)
    
  • तैयार स्टेटमेंट के लिए वैरिएबल तैयार करें (यह लंबी क्वेरी है, लेकिन मैंने ऊपर स्पष्टीकरण छोड़ दिया है):

    SET @sql = (SELECT CONCAT('ALTER TABLE t CHANGE `',COLUMN_NAME, '` `', COLUMN_NAME, '` ', @new_type, IF(IS_NULLABLE='NO', ' NOT NULL ', ' '), EXTRA) AS s FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t' AND [email protected]_name);
    
  • बयान तैयार करें:

    mysql> prepare stmt from @sql;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
  • अंत में, इसे निष्पादित करें:

    mysql> execute stmt;
    Query OK, 0 rows affected (0.22 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

फिर हम अपने डेटा प्रकार को VARCHAR(10) . में बदल देंगे बाकी सभी स्पेसिफायर को सेव करने के साथ:

mysql> DESCRIBE t;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| value | varchar(10)      | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्थानीय अनुक्रम विन्यास के लिए एक पर्यावरण चर का उपयोग करना

  2. call_log . से समवर्ती फोन कॉल की अधिकतम संख्या प्राप्त करें

  3. mysql मामले में सबक्वायरी जब क्लॉज

  4. REGEXP के लिए मैसकल अनुकूलन

  5. जेएस दिनांक समय को MySQL डेटाटाइम में कनवर्ट करें