Voici une solution de travail (juste essayée avec MySQL 5.0 sur 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 ;
À première vue, cela semble probablement plus compliqué que prévu, mais nous devons faire face aux problèmes suivants :
IF
les instructions ne fonctionnent que dans les procédures stockées, pas lorsqu'elles sont exécutées directement, par exemple. dans le client mysql- plus élégant et concis
SHOW COLUMNS
ne fonctionne pas dans la procédure stockée, il faut donc utiliser INFORMATION_SCHEMA - la syntaxe des instructions de délimitation est étrange dans MySQL, vous devez donc redéfinir le délimiteur pour pouvoir créer des procédures stockées. N'oubliez pas de remettre le délimiteur !
- INFORMATION_SCHEMA est global pour toutes les bases de données, n'oubliez pas de filtrer sur
TABLE_SCHEMA=DATABASE()
.DATABASE()
renvoie le nom de la base de données actuellement sélectionnée.