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

tilføj kolonne til mysql-tabellen, hvis den ikke eksisterer

Her er en fungerende løsning (lige prøvet med MySQL 5.0 på 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 ;

Ved første øjekast ser det nok mere kompliceret ud, end det burde, men vi er nødt til at håndtere følgende problemer her:

  • IF sætninger virker kun i lagrede procedurer, ikke når de køres direkte, f.eks. i mysql-klient
  • mere elegant og kortfattet SHOW COLUMNS virker ikke i den lagrede procedure, så du skal bruge INFORMATION_SCHEMA
  • syntaksen til afgrænsning af udsagn er mærkelig i MySQL, så du skal omdefinere afgrænsningstegnet for at kunne oprette lagrede procedurer. Glem ikke at skifte afgrænseren tilbage!
  • INFORMATION_SCHEMA er global for alle databaser, glem ikke at filtrere på TABLE_SCHEMA=DATABASE() . DATABASE() returnerer navnet på den aktuelt valgte database.


  1. onCreate() af RoomDatabase.Callback() blev ikke kaldt efter et vellykket kald til .build()

  2. dynamisk sql-forespørgsel i postgres

  3. Top Facebook-grupper til Analytics, Big Data, Data Mining, Hadoop, NoSQL, Data Science

  4. Skinner omfang - hvor i nøjagtige matcher