sql >> Databáze >  >> RDS >> Mysql

přidat sloupec do tabulky mysql, pokud neexistuje

Zde je funkční řešení (právě vyzkoušeno s MySQL 5.0 na 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 ;

Na první pohled to pravděpodobně vypadá složitější, než by mělo, ale musíme se zde vypořádat s následujícími problémy:

  • IF příkazy fungují pouze v uložených procedurách, nikoli při přímém spuštění, např. v mysql klientovi
  • elegantnější a stručnější SHOW COLUMNS nefunguje v uložené proceduře, takže musíte použít INFORMATION_SCHEMA
  • Syntaxe pro oddělovací příkazy je v MySQL podivná, takže musíte předefinovat oddělovač, abyste mohli vytvářet uložené procedury. Nezapomeňte přepnout oddělovač zpět!
  • INFORMATION_SCHEMA je globální pro všechny databáze, nezapomeňte filtrovat podle TABLE_SCHEMA=DATABASE() . DATABASE() vrátí název aktuálně vybrané databáze.


  1. MySQLDumper:Nástroj pro zálohování databáze MySQL založený na PHP a Perlu

  2. Tipy pro lepší návrh databáze

  3. Aspekty výkonu pro dočasná data v Oracle

  4. Spojení více tabulek vrátí hodnotu NULL