Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spalte zur MySQL-Tabelle hinzufügen, wenn sie nicht vorhanden ist

Hier ist eine funktionierende Lösung (gerade ausprobiert mit MySQL 5.0 auf 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 ;

Auf den ersten Blick sieht es wahrscheinlich komplizierter aus, als es sollte, aber wir müssen uns hier mit folgenden Problemen auseinandersetzen:

  • IF Anweisungen funktionieren nur in gespeicherten Prozeduren, nicht wenn sie direkt ausgeführt werden, z. im MySQL-Client
  • eleganter und prägnanter SHOW COLUMNS funktioniert nicht in gespeicherten Prozeduren, daher muss INFORMATION_SCHEMA
  • verwendet werden
  • Die Syntax zum Trennen von Anweisungen ist in MySQL seltsam, daher müssen Sie das Trennzeichen neu definieren, um gespeicherte Prozeduren erstellen zu können. Vergessen Sie nicht, das Trennzeichen wieder zurückzuschalten!
  • INFORMATION_SCHEMA ist global für alle Datenbanken, vergessen Sie nicht, nach TABLE_SCHEMA=DATABASE() zu filtern . DATABASE() gibt den Namen der aktuell ausgewählten Datenbank zurück.