Mysql
 sql >> Base de données >  >> RDS >> Mysql

ajouter une colonne à la table mysql si elle n'existe pas

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.