Показаны сообщения с ярлыком MySQL error 1054 и как с ней бороться. Показать все сообщения
Показаны сообщения с ярлыком MySQL error 1054 и как с ней бороться. Показать все сообщения

четверг, 11 апреля 2019 г.

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

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

Автор: Даниил Каменский , 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)

Результат

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