Berikut ini adalah solusi yang berfungsi (baru saja mencoba dengan MySQL 5.0 di Solaris):
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 ;
Sepintas mungkin terlihat lebih rumit dari yang seharusnya, tetapi kita harus menghadapi masalah berikut di sini:
IF
pernyataan hanya berfungsi dalam prosedur tersimpan, bukan saat dijalankan secara langsung, mis. di klien mysql- lebih elegan dan ringkas
SHOW COLUMNS
tidak berfungsi dalam prosedur tersimpan jadi harus menggunakan INFORMATION_SCHEMA - Sintaksis untuk pernyataan pembatas aneh di MySQL, jadi Anda harus mendefinisikan ulang pembatas untuk dapat membuat prosedur tersimpan. Jangan lupa untuk mengganti pembatas kembali!
- INFORMATION_SCHEMA bersifat global untuk semua database, jangan lupa untuk memfilter pada
TABLE_SCHEMA=DATABASE()
.DATABASE()
mengembalikan nama database yang dipilih saat ini.