Ето работещо решение (току-що изпробвано с MySQL 5.0 на 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 ;
На пръв поглед вероятно изглежда по-сложно, отколкото би трябвало, но тук трябва да се справим със следните проблеми:
IF
операторите работят само в съхранени процедури, а не когато се изпълняват директно, напр. в mysql клиент- по-елегантен и сбит
SHOW COLUMNS
не работи в съхранена процедура, така че трябва да използвате INFORMATION_SCHEMA - Синтаксисът за изрази за разделяне е странен в MySQL, така че сте дефинирали отново разделителя, за да можете да създавате съхранени процедури. Не забравяйте да превключите обратно разделителя!
- INFORMATION_SCHEMA е глобална за всички бази данни, не забравяйте да филтрирате в
TABLE_SCHEMA=DATABASE()
.DATABASE()
връща името на текущо избраната база данни.