Oto działające rozwiązanie (wypróbowane właśnie z MySQL 5.0 na Solarisie):
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 ;
Na pierwszy rzut oka prawdopodobnie wygląda to na bardziej skomplikowane niż powinno, ale tutaj mamy do czynienia z następującymi problemami:
IF
instrukcje działają tylko w procedurach składowanych, a nie gdy są uruchamiane bezpośrednio, np. w kliencie mysql- bardziej elegancki i zwięzły
SHOW COLUMNS
nie działa w procedurze składowanej, więc musisz użyć INFORMATION_SCHEMA - Składnia do oddzielania instrukcji jest dziwna w MySQL, więc musisz przedefiniować ogranicznik, aby móc tworzyć procedury składowane. Nie zapomnij przełączyć ogranicznika z powrotem!
- INFORMATION_SCHEMA jest globalna dla wszystkich baz danych, nie zapomnij filtrować według
TABLE_SCHEMA=DATABASE()
.DATABASE()
zwraca nazwę aktualnie wybranej bazy danych.