MySQL: как создать столбец, если он не существует?

14

Я пытаюсь создать столбец для моей таблицы, только если она не существует. Я много исследовал, но пока не нашел решения.

Действительно ли возможно условно создать колонку?

ZZZZZ
источник
Мне любопытно ... Что плохого в том, чтобы позволить альтеру сбоить при ошибке, если столбец уже существует?
Дерек Дауни
На самом деле мне нужно предоставить .sql файл для моего клиента, который будет иметь все запросы, связанные с изменениями структуры БД. Я не могу отправить всю базу данных им. Я просто хочу отправить им изменения в БД. в этом файле sql еще много запросов. Если этот запрос о создании столбцов потерпел неудачу, то все запросы не будут выполнены. Вот почему я хочу использовать условие if для создания столбца.
zzzzz
Если ваша база данных поддерживает это, вы можете использовать триггер. ДО ВСТАВКИ.
Кибернард

Ответы:

8

MySQL ALTER TABLEне имеет IF EXISTSспецификации.

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

псевдокод:

  • Найдите, существует ли столбец, используя SQL ниже:

    ВЫБРАТЬ column_name ИЗ INFORMATION_SCHEMA. COLUMNS ГДЕ TABLE_SCHEMA= [Имя базы данных] И TABLE_NAME= [Имя таблицы];

  • Если приведенный выше запрос возвращает результат, это означает, что столбец существует, в противном случае вы можете продолжить и создать столбец.

thatsaru
источник
В MySQL / MariaDB я получаю ошибку, используя этот запрос, утверждая, что column_nameне существует. Я переформулировал вопрос:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
Иисус Алонсо Абад
2
Для простого ответа 0 или 1 на MySQL и (я думаю) MariaDB:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
piojo
14

На самом деле существует сейчас для Марии DB 10.219

ALTER TABLE test ADD COLUMN IF NOT EXISTS column_a VARCHAR(255);

Бонус, это работает и для MODIFY

ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);
Paroofkey
источник
3
> "MYSQL 5.5.5"? Это не правильно, это только функция Maria DB.
Экскалибур
1
спасибо за исправление
Paroofkey
6

Вы можете использовать это решение, уже упомянутое в другой публикации StackOverFlow: (ссылка: https://stackoverflow.com/a/31989541/ )

MySQL - ALTER TABLE, чтобы добавить столбец, если он не существует:

SET @dbname = DATABASE();
SET @tablename = "tableName";
SET @columnname = "colName";
SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = @tablename)
      AND (table_schema = @dbname)
      AND (column_name = @columnname)
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT(11);")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
Анто Хосе
источник
2

Это ниже работало для меня:

    SELECT count(*)
    INTO @exist
    FROM information_schema.columns
    WHERE table_schema = 'mydatabase'
    and COLUMN_NAME = 'mycolumn'
    AND table_name = 'mytable' LIMIT 1;

    set @query = IF(@exist <= 0, 'ALTER TABLE mydatabase.`mytable`  ADD COLUMN `mycolumn` MEDIUMTEXT NULL',
    'select \'Column Exists\' status');

    prepare stmt from @query;

    EXECUTE stmt;
Тейпал Шарма
источник
Я пошел с этим, спасибо.
Стюарт Макинтайр