जैसा कि मैन्युअल पेज
में बताया गया है , 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)