Hier is een werkende oplossing (net uitgeprobeerd met MySQL 5.0 op 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 ;
Op het eerste gezicht lijkt het waarschijnlijk ingewikkelder dan het zou moeten, maar we hebben hier te maken met de volgende problemen:
IF
instructies werken alleen in opgeslagen procedures, niet wanneer ze rechtstreeks worden uitgevoerd, b.v. in mysql-client- eleganter en beknopter
SHOW COLUMNS
werkt niet in de opgeslagen procedure, dus moet INFORMATION_SCHEMA gebruiken - de syntaxis voor het afbakenen van instructies is vreemd in MySQL, dus u moet het scheidingsteken opnieuw definiëren om opgeslagen procedures te kunnen maken. Vergeet niet het scheidingsteken terug te zetten!
- INFORMATION_SCHEMA is globaal voor alle databases, vergeet niet te filteren op
TABLE_SCHEMA=DATABASE()
.DATABASE()
geeft de naam van de momenteel geselecteerde database terug.