Hier ist eine funktionierende Lösung (gerade ausprobiert mit MySQL 5.0 auf 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 ;
Auf den ersten Blick sieht es wahrscheinlich komplizierter aus, als es sollte, aber wir müssen uns hier mit folgenden Problemen auseinandersetzen:
IF
Anweisungen funktionieren nur in gespeicherten Prozeduren, nicht wenn sie direkt ausgeführt werden, z. im MySQL-Client- eleganter und prägnanter
SHOW COLUMNS
funktioniert nicht in gespeicherten Prozeduren, daher muss INFORMATION_SCHEMA
verwendet werden - Die Syntax zum Trennen von Anweisungen ist in MySQL seltsam, daher müssen Sie das Trennzeichen neu definieren, um gespeicherte Prozeduren erstellen zu können. Vergessen Sie nicht, das Trennzeichen wieder zurückzuschalten!
- INFORMATION_SCHEMA ist global für alle Datenbanken, vergessen Sie nicht, nach
TABLE_SCHEMA=DATABASE()
zu filtern .DATABASE()
gibt den Namen der aktuell ausgewählten Datenbank zurück.