MySQL: Як створити стовпець, якщо його немає?


14

Я намагаюся створити стовпчик для моєї таблиці, лише якщо він не існує. Я багато досліджував, але не зміг знайти рішення.

Чи справді можливо умовно створити стовпчик?


Мені цікаво ... Що поганого в тому, щоб просто змінити помилку, якщо стовпець вже існує?
Дерек Дауні

Насправді мені потрібно надати .sql файл своєму клієнту, який би містив усі запити, пов'язані зі змінами структури БД. Я не можу надіслати їх цілою базою даних. Я просто хочу надіслати їм db зміни. у цьому файлі sql є ще багато запитів. Якщо цей запит про створення стовпців виявився невдалим, він би не виконав усі запити. Тому я хочу використовувати, якщо умова для створення стовпця.
zzzzz

Якщо ваша база даних підтримує її, ви можете використовувати тригер. ПЕРЕД ВСТУП.
кібернард

Відповіді:


8

У MySQL ALTER TABLEнемає IF EXISTSспецифікацій.

Ви можете зробити наступне, використовуючи збережену програму чи мову програмування, якщо це те, що вам потрібно робити регулярно:

Псевдокод:

  • Визначте, чи існує стовпець за допомогою SQL нижче:

    ВИБРАТИ column_name З INFORMATION_SCHEMA. COLUMNS WHERE TABLE_SCHEMA= [Назва бази даних] AND TABLE_NAME= [Назва таблиці];

  • Якщо вищезазначений запит повертає результат, то це означає, що стовпець існує, інакше можна продовжити і створити стовпець.


У 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

Насправді існує зараз для Марії БД 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);

3
> "MYSQL 5.5.5"? Це невірно, це лише функція БД Марії.
Excalibur

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;

Я пішов з цим, дякую.
Стюарт Макінтайр,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.