Mysql
 sql >> Baza danych >  >> RDS >> Mysql

dodaj kolumnę do tabeli mysql, jeśli nie istnieje

Oto działające rozwiązanie (wypróbowane właśnie z MySQL 5.0 na Solarisie):

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 pierwszy rzut oka prawdopodobnie wygląda to na bardziej skomplikowane niż powinno, ale tutaj mamy do czynienia z następującymi problemami:

  • IF instrukcje działają tylko w procedurach składowanych, a nie gdy są uruchamiane bezpośrednio, np. w kliencie mysql
  • bardziej elegancki i zwięzły SHOW COLUMNS nie działa w procedurze składowanej, więc musisz użyć INFORMATION_SCHEMA
  • Składnia do oddzielania instrukcji jest dziwna w MySQL, więc musisz przedefiniować ogranicznik, aby móc tworzyć procedury składowane. Nie zapomnij przełączyć ogranicznika z powrotem!
  • INFORMATION_SCHEMA jest globalna dla wszystkich baz danych, nie zapomnij filtrować według TABLE_SCHEMA=DATABASE() . DATABASE() zwraca nazwę aktualnie wybranej bazy danych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Składnia SQL DELETE – wymieniona przez DBMS

  2. Emuluj klauzulę LIMIT MySQL w Microsoft SQL Server 2000

  3. Jak używać instrukcji CASE w MySQL?

  4. Jak włączyć automatyczne ponowne łączenie klienta MySQL z MySQLdb?

  5. MySQL Z klauzulą