これが実用的な解決策です(Solaris上の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を使用する必要があります - MySQLではステートメントを区切る構文がおかしいため、ストアドプロシージャを作成できるようにするには、区切り文字を再定義する必要があります。区切り文字を元に戻すことを忘れないでください!
- INFORMATION_SCHEMAはすべてのデータベースに対してグローバルです。
TABLE_SCHEMA=DATABASE()
でフィルタリングすることを忘れないでください。 。DATABASE()
現在選択されているデータベースの名前を返します。