यहाँ एक कार्यशील समाधान है (सोलारिस पर अभी MySQL 5.0 के साथ आज़माया गया):
DELIMITER $$
DROP PROCEDURE IF EXISTS upgrade_database_1_0_to_2_0 $$
CREATE PROCEDURE upgrade_database_1_0_to_2_0()
BEGIN
-- rename a table safely
IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
AND TABLE_NAME='my_old_table_name') ) THEN
RENAME TABLE
my_old_table_name TO my_new_table_name,
END IF;
-- add a column safely
IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
AND COLUMN_NAME='my_additional_column' AND TABLE_NAME='my_table_name') ) THEN
ALTER TABLE my_table_name ADD my_additional_column varchar(2048) NOT NULL DEFAULT '';
END IF;
END $$
CALL upgrade_database_1_0_to_2_0() $$
DELIMITER ;
पहली नज़र में यह शायद उससे कहीं अधिक जटिल लगता है, लेकिन हमें यहाँ निम्नलिखित समस्याओं से निपटना होगा:
IF
कथन केवल संग्रहीत कार्यविधियों में काम करते हैं, न कि सीधे चलने पर, उदा। mysql क्लाइंट में- अधिक सुंदर और संक्षिप्त
SHOW COLUMNS
संग्रहीत कार्यविधि में काम नहीं करता है इसलिए INFORMATION_SCHEMA
. का उपयोग करना होगा - माईएसक्यूएल में बयानों को सीमित करने के लिए वाक्यविन्यास अजीब है, इसलिए आपको डिलीमीटर को संग्रहीत प्रक्रियाओं को बनाने में सक्षम होने के लिए फिर से परिभाषित करना होगा। सीमांकक को वापस स्विच करना न भूलें!
- INFORMATION_SCHEMA सभी डेटाबेस के लिए वैश्विक है,
TABLE_SCHEMA=DATABASE()
पर फ़िल्टर करना न भूलें .DATABASE()
वर्तमान में चयनित डेटाबेस का नाम देता है।