Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

adicionar coluna à tabela mysql se ela não existir


Aqui está uma solução de trabalho (experimentada com o MySQL 5.0 no 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 ;

À primeira vista, provavelmente parece mais complicado do que deveria, mas temos que lidar com os seguintes problemas aqui:
  • IF instruções só funcionam em procedimentos armazenados, não quando executados diretamente, por exemplo. no cliente mysql
  • mais elegante e conciso SHOW COLUMNS não funciona no procedimento armazenado, então tem que usar INFORMATION_SCHEMA
  • a sintaxe para delimitar instruções é estranha no MySQL, então você precisa redefinir o delimitador para poder criar procedimentos armazenados. Não se esqueça de mudar o delimitador de volta!
  • INFORMATION_SCHEMA é global para todos os bancos de dados, não se esqueça de filtrar em TABLE_SCHEMA=DATABASE() . DATABASE() retorna o nome do banco de dados atualmente selecionado.