sql >> Database >  >> RDS >> Mysql

kolom toevoegen aan mysql-tabel als deze niet bestaat

Hier is een werkende oplossing (net uitgeprobeerd met MySQL 5.0 op 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 ;

Op het eerste gezicht lijkt het waarschijnlijk ingewikkelder dan het zou moeten, maar we hebben hier te maken met de volgende problemen:

  • IF instructies werken alleen in opgeslagen procedures, niet wanneer ze rechtstreeks worden uitgevoerd, b.v. in mysql-client
  • eleganter en beknopter SHOW COLUMNS werkt niet in de opgeslagen procedure, dus moet INFORMATION_SCHEMA gebruiken
  • de syntaxis voor het afbakenen van instructies is vreemd in MySQL, dus u moet het scheidingsteken opnieuw definiëren om opgeslagen procedures te kunnen maken. Vergeet niet het scheidingsteken terug te zetten!
  • INFORMATION_SCHEMA is globaal voor alle databases, vergeet niet te filteren op TABLE_SCHEMA=DATABASE() . DATABASE() geeft de naam van de momenteel geselecteerde database terug.


  1. Zet automatische sleutelgeneratie in de slaapstand met MySQL en Oracle

  2. Zoek een waarde in de kolomwaarde die door komma's gescheiden waarden opslaat

  3. SQLite - Een tabel wijzigen

  4. Ontmoetingen op de werkplek:ruimte terugwinnen uit een te grote database