Я пытаюсь создать столбец для моей таблицы, только если она не существует. Я много исследовал, но пока не нашел решения.
Действительно ли возможно условно создать колонку?
Я пытаюсь создать столбец для моей таблицы, только если она не существует. Я много исследовал, но пока не нашел решения.
Действительно ли возможно условно создать колонку?
Ответы:
MySQL ALTER TABLE
не имеет IF EXISTS
спецификации.
Вы можете сделать следующее, используя хранимый процесс или язык программирования, если это то, что вам нужно делать на регулярной основе:
псевдокод:
Найдите, существует ли столбец, используя SQL ниже:
ВЫБРАТЬ column_name
ИЗ INFORMATION_SCHEMA
. COLUMNS
ГДЕ TABLE_SCHEMA
= [Имя базы данных] И TABLE_NAME
= [Имя таблицы];
Если приведенный выше запрос возвращает результат, это означает, что столбец существует, в противном случае вы можете продолжить и создать столбец.
column_name
не существует. Я переформулировал вопрос:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
На самом деле существует сейчас для Марии 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);
Вы можете использовать это решение, уже упомянутое в другой публикации 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;
Это ниже работало для меня:
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;