Подтвердить что ты не робот

Изменить таблицу, если существует или создать, если не

Мне нужно запустить установщик, который также может быть обновлением. Установщик должен иметь возможность получить определенную схему/структуру базы данных mysql, независимо от того, существуют ли некоторые из таблиц, пропустили несколько столбцов или их не нужно менять, поскольку их структура обновлена.

Как я могу сделать элегантную комбинацию ALTER и CREATE?

Я думал, что должно быть что-то вроде "ADD... IF... Duplicate"

Скажем, у меня есть таблица A. В одном клиенте таблица имеет один столбец -A1, а другой клиент имеет одну и ту же таблицу, но с столбцом A1 и столбцом A2.

Я хочу, чтобы моя команда sql заставила обе таблицы клиентов удерживать три столбца: A1, A2 и A3.

Опять же, мой script представляет собой файл sql, который я дамп для mysql.

Как мне это сделать? Спасибо: -)

4b9b3361

Ответ 1

База данных MySQL INFORMATION_SCHEMA на помощь:

-- First check if the table exists
IF EXISTS(SELECT table_name 
            FROM INFORMATION_SCHEMA.TABLES
           WHERE table_schema = 'db_name'
             AND table_name LIKE 'wild')

-- If exists, retreive columns information from that table
THEN
   SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
     FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'tbl_name'
      AND table_schema = 'db_name';

   -- do some action, i.e. ALTER TABLE if some columns are missing 
   ALTER TABLE ...

-- Table does not exist, create a new table
ELSE
   CREATE TABLE ....

END IF;

Дополнительная информация:

UPDATE:

Другим вариантом, возможно, проще - удалить существующую таблицу и снова создать ее с помощью новой схемы. Для этого вам необходимо:

  • Создать временную таблицу, точную копию существующей таблицы
  • Заполните временную таблицу данными из старой таблицы
  • Удалить старую таблицу
  • Создать новую таблицу с новой схемой
  • Заполните новую таблицу информацией из временной таблицы
  • Удалить временную таблицу.

Итак, в SQL-коде:

CREATE TABLE old_table_copy LIKE old_table;

INSERT INTO old_table_copy
SELECT * FROM old_table;

DROP TABLE old_table;

CREATE TABLE new_table (...new values...);

INSERT INTO new_table ([... column names from old table ...])
SELECT [...column names from old table ...] 
FROM old_table_copy;

DROP TABLE old_table_copy;

Фактически на последнем шаге "Drop временная таблица" вы можете пропустить некоторое время. На всякий случай, вы хотели бы иметь какую-то резервную копию старой таблицы "just-in-case".

Дополнительная информация:

Ответ 2

Хорошо, если вы используете язык кодирования:

SHOW TABLES LIKE 'myTable'

если он возвращает вызов значения alter else, вызовите create