webew
Войти » Регистрация
 
MySQL/MariaDB

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

29 марта 2011, 22:36

При использовании ряда 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. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

ngy1984

а что делать вот с такой ошибкой?->Unknown column 'username' in 'where clause'
ngy
29.11.2011, 17:58
Ответить

deadka

Подозреваю, что ровно то, о чем в статье написано - добавить столбец username.
Через more, через less мы бредем в страну чудес...
29.11.2011, 18:08
Ответить
NO USERPIC

ngy1984

каким образом? объясните подробней пожалуйста...
ngy
29.11.2011, 20:03
Ответить
NO USERPIC

ngy1984

выдает ошибку 1064
ngy
29.11.2011, 20:10
Ответить

deadka

Приведите структуру таблицы, с которой Вы работаете (запрос "show create table t"),
запрос, который Вы запускаете и полный текст ошибки.
Через more, через less мы бредем в страну чудес...
29.11.2011, 20:13
Ответить

andreygrand

выдает ошибку 1064
есть такое...
успех
24.12.2011, 22:39
Ответить

deadka

Таки та же рекомендация - какой полный текст ошибки? Какой текст запроса? и приведите структуру таблицы.
Через more, через less мы бредем в страну чудес...
25.12.2011, 08:48
Ответить

golovonog

Вот что выдает мне сервер при удалении новостей в ДЛЕ

The Error returned was:
Unknown column 'news_id' in 'where clause'

Error Number:
1054


DELETE FROM dle_tags WHERE news_id = '1111139778'


Из выше прочитаного я понял что нехватает колонки 'news_id' но как опредилить вв какую таблицу ее добавить?
Зарание спасибо!
MySQL учюсь
12.06.2012, 15:40
Ответить
NO USERPIC

rgbeast

Судя по запросу, в таблицу dle_tags
12.06.2012, 18:12
Ответить
NO USERPIC

Ministers

Обновил движок DLE с 10,0 до 10,1
После обновления не мог исправить категорию. Выдавал ошибку.

Error Number: 1054
The Error returned was:
Unknown column 'show_sub' in 'field list'


Испраил:
Зашел в phpMyAdmin
Выбрал таблицу dle_category
Во вкладке SQL Ввел запрос на добавление столбца:
ALTER TABLE dle_category ADD COLUMN show_sub int DEFAULT '0';

Проблема решена.

P.S. во время исправления почистите кеш.
14.12.2013, 19:35
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: