Я пытаюсь написать запрос, который будет проверять, есть ли в конкретной таблице в MySQL определенный столбец, а если нет - создать его. Иначе ничего не делать. Это действительно простая процедура в любой базе данных корпоративного класса, но MySQL кажется исключением.
Я думал что-то вроде
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='prefix_topic' AND column_name='topic_last_update')
BEGIN
ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL;
UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`;
END;
будет работать, но это плохо. Есть способ?
Ответы:
У меня это хорошо работает.
С PHP это было бы что-то вроде ...
источник
@julio
Спасибо за пример SQL. Я попробовал запрос и считаю, что для правильной работы требуется небольшое изменение.
Это сработало для меня.
Спасибо!
источник
IF
и т.д. См. Stackoverflow.com/questions/7384711/… для примера того, как обернуть процедуру вокруг тест для столбца и условного оператора DML.Чтобы помочь любому, кто ищет конкретный пример того, что описывал @Mchl, попробуйте что-нибудь вроде
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Если он возвращает false (нулевые результаты), значит, столбец не существует.
источник
TABLE_NAME = 'my_table'
, TABLE_SCHEMA - это схема, в которой находится таблица. Т.е.SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Ниже приведен еще один способ сделать это с использованием простого PHP без базы данных information_schema:
источник
isset()
будет иметь значение «false», если ключ массива существует, но значение NULL . Лучше использоватьarray_key_exists()
лайкif( !array_key_exists( 'my_new_column', $mycol ) )
isset()
проверку. Это не решает вопрос, но лучше, если вам уже нужно выполнить запрос выбора и получить результат в памяти.Я добавил эту хранимую процедуру вместе с началом из комментариев @lain выше, что неплохо, если вам нужно вызывать ее более нескольких раз (и не требует php):
Работаю с
fieldExists
источник
ExpirationDate
поле. 😊Выберите только имя_столбца из информационной схемы и поместите результат этого запроса в переменную. Затем проверьте переменную, чтобы решить, нуждается ли таблица в изменении или нет.
PS Не забудьте указать TABLE_SCHEMA и для таблицы COLUMNS.
источник
Я использую этот простой скрипт:
Это работает, если вы уже подключены к базе данных.
источник
Большое спасибо Mfoo, который разместил действительно хороший скрипт для динамического добавления столбцов, если их нет в таблице. Я улучшил его ответ с помощью PHP . Сценарий дополнительно поможет найти сколько таблиц на самом деле необходимый «Добавить столбец» MySQL COMAND. Просто попробуйте рецепт. Работает как шарм.
источник
Эта работа для меня с образцом PDO:
источник
ЗАПРЕЩАЕТСЯ помещать ALTER TABLE / MODIFY COLS или любые другие подобные операции с модификациями таблиц в ТРАНЗАКЦИЮ. Транзакции предназначены для возможности откатить сбой QUERY, а не для ИЗМЕНЕНИЙ ... он будет ошибаться каждый раз в транзакции.
Просто запустите запрос SELECT * к таблице и проверьте, есть ли там столбец ...
источник
ALTER
(и подобный DDL) в MySQL действительно фиксирует (неявно) транзакцию. Но использование SELECT * приведет к большим накладным расходам в сети из-за простой проверки существования столбца. Вместо этого вы можете попробоватьSELECT my_col_to_check FROM t LIMIT 0
: если mysql генерирует ошибку, вероятно, столбец не существует (тем не менее, проверьте ошибку, так как это может быть проблема с сетью или что-то еще!); если ошибки нет, значит столбец существует. Я не уверен, что это лучший способ проверить наличие столбца.