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

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'email_subscription' AND COLUMN_NAME = 'subscribe_all')
  THEN 
  ALTER TABLE email_subscription
  ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
  ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;

Я посмотрел на огромное количество примеров. но этот запрос не работает, я получил ошибку:

ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверить руководство, соответствующее вашей версии сервера MySQL для правильного синтаксис для использования рядом "ЕСЛИ НЕ СУЩЕСТВУЕТ" (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'в строке 1

Ответ 1

вы можете создать процедуру для запроса,

DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
    DECLARE _count INT;
    SET _count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_NAME = 'email_subscription' AND 
                            COLUMN_NAME = 'subscribe_all');
    IF _count = 0 THEN
        ALTER TABLE email_subscription
            ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
            ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
    END IF;
END $$
DELIMITER ;

Ответ 2

Если ваш хост не дает вам разрешения на создание или запуск процедур, я думаю, что нашел другой способ сделать это, используя PREPARE/EXECUTE и запросив схему:

SET @s = (SELECT IF(
    (SELECT COUNT(*)
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = 'table_name'
        AND table_schema = DATABASE()
        AND column_name = 'col_name'
    ) > 0,
    "SELECT 1",
    "ALTER TABLE table_name ADD col_name VARCHAR(100)"
));

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Ответ 3

В одном выражении MySQL нет эквивалентного синтаксиса.

Чтобы получить что-то похожее, вы можете

1) попытайтесь добавить столбец с ALTER TABLE и пусть MySQL вызывает ошибку, если столбец этого имени уже существует в таблице или

2) запросите представление information_schema.columns, чтобы проверить, существует ли столбец этого имени в таблице.

Обратите внимание, что вам действительно нужно проверить table_schema, а также имя_таблицы:

SELECT column_name
  FROM information_schema.columns 
 WHERE table_schema = 'foo'
   AND table_name   = 'email_subscription'
   AND column_name  = 'subscribe_all'

и на основании этого определите, следует ли запускать ALTER TABLE

Ответ 4

В MySQL используется синтаксис MS SQL Server.

Ответ 5

Также добавьте условие для имени базы данных, чтобы проверить наличие столбца.

Попробуйте следующее:

DELIMITER $$
CREATE PROCEDURE sp_AlterTable()
BEGIN
    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                   WHERE TABLE_SCHEMA = 'dbName' AND 
                         TABLE_NAME = 'email_subscription' AND 
                         COLUMN_NAME = 'subscribe_all') THEN 
       ALTER TABLE email_subscription
          ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
          ADD COLUMN subscribe_category VARCHAR(512) DEFAULT NULL;
    END IF; 
END $$
DELIMITER ;

Ответ 6

SET @s = (SELECT IF(
    (SELECT COUNT(column_name)
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE table_name = 'oc_bitcoin_wallets_receive'
          AND table_schema = 'k_opencart2'
          AND column_name = 'test3'
    ) > 0,
    "SELECT 1",
    "ALTER TABLE `oc_bitcoin_wallets_receive` ADD COLUMN `test3` INT NOT NULL AFTER `test2`;"
));
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Значения для редактирования:   oc_bitcoin_wallets_receive - имя таблицы,   k_opencart2 - имя базы данных,   test3 - имя нового столбца,   oc_bitcoin_wallets_receive - вторая таблица местоположений   test3 - второй столбец местоположения,   test2 - имя столбца перед новым столбцом.