Mysql
 sql >> Database >  >> RDS >> Mysql

aggiungi colonna alla tabella mysql se non esiste

Ecco una soluzione funzionante (appena provata con MySQL 5.0 su 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 ;

A prima vista probabilmente sembra più complicato di quanto dovrebbe, ma qui dobbiamo affrontare i seguenti problemi:

  • IF le istruzioni funzionano solo nelle procedure memorizzate, non quando eseguite direttamente, ad es. nel client MySQL
  • più elegante e conciso SHOW COLUMNS non funziona nella procedura memorizzata, quindi è necessario utilizzare INFORMATION_SCHEMA
  • la sintassi per delimitare le istruzioni è strana in MySQL, quindi è necessario ridefinire il delimitatore per poter creare stored procedure. Non dimenticare di reimpostare il delimitatore!
  • INFORMATION_SCHEMA è globale per tutti i database, non dimenticare di filtrare su TABLE_SCHEMA=DATABASE() . DATABASE() restituisce il nome del database attualmente selezionato.