SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

MySQL error 1054 и как с ней бороться

Дата: 25.11.2013

Автор: Даниил Каменский , dkamenskiy (at) yandex (dot) ru

При использовании ряда CMS (например, DLE, vBulletin и др.) временами возникает ошибка mysql с номером 1054.

Текст ошибки Unknown column 'ИМЯ_СТОЛБЦА' in 'field list' в переводе означает "Неизвестный столбец 'ИМЯ_СТОЛБЦА' в списке полей.". Такая ошибка возникает в том случае, если попытаться выбрать (запрос вида select) или изменить (запрос вида update) данные из столбца, которого не существует. Ошибка чаще всего возникает из-за стoронних модулей. Перечислим несколько возможных причин:

  • установлен модуль, расчитанный на более новую версию CMS, чем используемая;
  • при установке модуля не выполнились операции изменения структуры таблиц;
  • после установки сторонних модулей выполнено обновление системы, которое привело к изменению структуры таблиц; при этом модуль не был обновлен на совместимый;
  • Из резервной копии восстановлена более старая база данных, а файлы сайта остались в новой версии.
Пример №1: Имеется таблица сотрудников подразделения. Поля: id, фамилия, имя, отчество, год рождения, наличие высшего образования.


create table if not exists employee
(
`id` int(11) NOT NULL auto_increment primary key,
`surname` varchar(255) not null,
`name` varchar(255) not null,
`patronymic` varchar(255) not null,
`year_of_birth` int unsigned default 0,
`higher_education` tinyint unsigned default 0
) ENGINE=MyISAM;
 

Если обратиться к этой таблице с запросом на выборку несуществующего поля, например пола сотрудника по фамилии Власенко, то результатом будет вышеуказанная ошибка:
mysql> select sex from employee where surname='Власенко';
ERROR 1054 (42S22): Unknown column 'sex' in 'field list'


Пример №2: Воспользуемся той же таблицей из примера 1. Если попытаться указать мужской пол у сотрудника по имени Власенко (выяснилось его имя и стало ясно, что это мужчина), то результатом будет та же ошибка:
mysql> update employee set sex=1 where surname='Власенко';
ERROR 1054 (42S22): Unknown column 'sex' in 'field list'


Способы борьбы

Самый корректный способ борьбы в устранении причины ошибки. Например, все обновления сайта рекомендуем выполнять сначала на копии сайта и если ошибок нет, то повторять на рабочем сайте. Если при обновлении возникла ошибка, следует найти способ сделать обновление корректно с учетом версий сторонних модулей.

Если по каким-то причинам корректно избежать ошибки не получилось, можно прибегнуть к симптоматическому лечению, которое состоит в простом добавлении недостающих полей в таблицу.

Запрос на добавление:
ALTER TABLE employee ADD COLUMN sex ENUM('male', 'female') DEFAULT 'female'
 
Что в переводе означает "Изменить таблицу employee, добавив столбец `пол`, назначив ему тип перечисление(мужской/женский) по умолчанию мужской".

При таком добавлении столбца необходимо учитывать, что у всех записей в таблице в столбце sex появится значение по умолчанию. Если добавлять такой столбец как пол (который не может быть равен null и обязательно присутствует у каждого человека), то просто необходимо сразу же после этого прописать нужное значение во все записи в таблице. В данном случае с добавлением столбца "пол" нужно будет поменять значение на male у всех сотрудников мужского пола.

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


Примеры:
a) Запрос:
SELECT faqname, faqparent, displayorder, volatile FROM faq where product
IN ('', 'vbulletin', 'watermark', 'cyb_sfa', 'access_post_and_days');

Ответ сервера:
Invalid SQL: SELECT faqname, faqparent, displayorder, volatile FROM faq where product IN ('', 'vbulletin', 'watermark', 'cyb_sfa', 'access_post_and_days');
MySQL Error: Unknown column 'faqname' in 'field list'
Error Number: 1054

Отсутствует столбец faqname, добавим его. Логика подсказывает, что если имя - то это скорее всего символы, а не целое число или тип datetime. Количество символов заранее, конечно, неизвестно, но редко имя бывает больше чем 255 символов. Поэтому добавим столбец faqname с указанием типа varchar(255):

ALTER TABLE faq ADD faqname varchar(255)

б) Запроc:
UPDATE dle_usergroups set group_name='Журналисты', allow_html='0' WHERE id='3';

Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name='Журналисты', allow_html='0' WHERE id='3';
MySQL Error: Unknown column 'allow_html' in 'field list'
Error Number: 1054

Отсутствует столбец allow_html, добавим его. Смотрим на то значение, которое туда пытается вставить запрос, видим 0. Скорее всего этот столбец может принимать два значения - разрешить/не разрешить (1 или 0), то есть однобайтное целое число вполне подойдёт. Поэтому добавим столбец allow_html с указанием типа tinyint:

ALTER TABLE faq ADD allow_html tinyint

Таким образом можно составить шаблон для "лечения" таких проблем: ALTER TABLE [a] ADD [b] [c];, где
a - имя таблицы, откуда выбираются (или где обновляются) данные;
b - имя столбца, который нужно добавить;
c - тип данных.

Примеры (во всех примерах идёт работа с таблицей dle_usergroups):

1) Запрос:
UPDATE dle_usergroups set group_name='Журналисты', allow_html='0' WHERE id='3';

Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name='Журналисты', allow_html='0' WHERE id='3';
MySQL Error: Unknown column 'allow_html' in 'field list'
Error Number: 1054

Решение:
a=dle_usergroups, b=allow_html, c=tinyint, то есть
ALTER TABLE dle_usergroups ADD allow_html tinyint
Для того, чтобы выполнить исправляющий ошибку запрос, необходимо воспользоваться каким-либо mysql-клиентом. В стандартной поставке mysql всегда идёт консольный клиент с названием mysql (в windows mysql.exe). Для того, чтобы подключиться к mysql выполните команду
mysql -hНАЗВАНИЕ_ХОСТА -uИМЯ_ПОЛЬЗОВАТЕЛЯ -pПАРОЛЬ ИМЯ_БАЗЫ_ДАННЫХ,
после чего введите необходимый запрос и точку с запятой после него в появившейся командной строке.
В том случае, если работа происходит на чужом сервере (например, арендуется хостинг) и нет возможности воспользоваться mysql-клиентом из командной строки (не всегда хостеры представляют такую возможность), можно воспользоваться тем инструментом, который предоставляет хостер - например, phpMyAdmin, и в нём ввести нужный sql-запрос.
В то же время наиболее подходящий инструмент для работы с mysql - это MySQL Workbench - разработка создателей mysql с достаточно удобным пользовательским интерфейсом.
Если же нет возможности подключиться к mysql напрямую (например из-за ограничений файрвола), то в ряде случаев возможно удалённо подключиться к MySQL-серверу через SSH-туннель.
2) Запрос:
UPDATE dle_usergroups set group_name='Журналисты', allow_subscribe='0' WHERE id='3';

Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name='Журналисты', allow_subscribe='0' WHERE id='3';
MySQL Error: Unknown column 'allow_subscribe' in 'field list'
Error Number: 1054

Решение: a=dle_usergroups, b=allow_subscribe, c=tinyint, то есть
ALTER TABLE dle_usergroups ADD allow_subscribe tinyint

3) Запрос:
SELECT faqname, faqparent, displayorder, volatile FROM faq where product IN ('', 'vbulletin', 'watermark', 'cyb_sfa', 'access_post_and_days');

Oтвет сервера:
InvalidSQL: SELECT faqname, faqparent, displayorder, volatile FROM faq where product IN ('', 'vbulletin', 'watermark', 'cyb_sfa', 'access_post_and_days');
MySQL Error: Unknown column 'faqname' in 'field list'
Error Number: 1054

Решение: a= faq, b=faqname, c=varchar(255), то есть
ALTER TABLE faq ADD faqname varchar(255)

Результат

В результате добавления необходимого поля ошибка должна исчезнуть. Однако, существует вероятность того, что в структуре таблиц не хватало несколько столбцов: в этом случае ошибка повторится с указанием другого имени столбца, для которого потребуется повторить процедуру. Помните, что добавление незаполненных столбцов угаданного типа не всегда будет соответствовать задуманной логике приложения и может нарушить часть функциональности.

Источник: webew.ru

Дата публикации: 25.11.2013

© Все права на данную статью принадлежат порталу SQLInfo.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в бумажных изданиях допускается только с разрешения редакции.

Статьи :
 Установка и настройка MySQL
>Коды ошибок в MySQL
 Программирование в MySQL
 Оптимизация производительности
 Кодировка символов в MySQL
 Хранение данных в MySQL
 MySQL Cluster
См. также:
 Оптимизация производительности MySQL
 Онлайн-курс по оптимизации MySQL
 Услуги по оптимизации MySQL