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 - имя столбца перед новым столбцом.