MySQL
Коды ошибок
Поиск…
Код ошибки 1064: Синтаксическая ошибка
select LastName, FirstName,
from Person
Возвращает сообщение:
Код ошибки: 1064. У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «от лица» по строке 2.
Получение сообщения «Ошибка 1064» из MySQL означает, что запрос не может быть проанализирован без ошибок синтаксиса. Другими словами, он не может понять смысл запроса.
Цитата в сообщении об ошибке начинается с первого символа запроса, который MySQL не может понять, как разбираться. В этом примере MySQL не может иметь смысла в контексте from Person
. В этом случае перед from Person
появляется дополнительная запятая. В запятой говорится, что MySQL ожидает другого описания столбца в предложении SELECT
Синтаксическая ошибка всегда говорит ... near '...'
. Вещь в начале цитат очень близка к ошибке. Чтобы найти ошибку, посмотрите на первый токен в кавычках и на последний токен перед кавычками.
Иногда вы получите ... near ''
; то есть ничего в кавычках. Это означает, что первый символ, который MySQL не может понять, находится в конце или в начале инструкции. Это предполагает, что запрос содержит несбалансированные кавычки ( '
или "
) или несбалансированные круглые скобки или что вы не закончили утверждение раньше.
В случае хранимой процедуры вы, возможно, забыли правильно использовать DELIMITER
.
Итак, когда вы получаете Error 1064, посмотрите текст запроса и найдите точку, указанную в сообщении об ошибке. Визуально проверяйте текст запроса прямо вокруг этой точки.
Если вы попросите кого-нибудь помочь вам устранить ошибку 1064, лучше всего предоставить как текст всего запроса, так и текст сообщения об ошибке.
Код ошибки 1175: безопасное обновление
Эта ошибка появляется при попытке обновления или удаления записей без включения WHERE
, которое использует столбец KEY
.
Чтобы выполнить удаление или обновление в любом случае - введите:
SET SQL_SAFE_UPDATES = 0;
Чтобы снова включить безопасный режим, введите:
SET SQL_SAFE_UPDATES = 1;
Код ошибки 1215: не удается добавить ограничение внешнего ключа
Эта ошибка возникает, когда таблицы недостаточно структурированы для обработки быстрой проверки соответствия требованиям внешнего ключа ( FK
), которые требуется разработчику.
CREATE TABLE `gtType` (
`type` char(2) NOT NULL,
`description` varchar(1000) NOT NULL,
PRIMARY KEY (`type`)
) ENGINE=InnoDB;
CREATE TABLE `getTogethers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` char(2) NOT NULL,
`eventDT` datetime NOT NULL,
`location` varchar(1000) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_gt2type` (`type`), -- see Note1 below
CONSTRAINT `gettogethers_ibfk_1` FOREIGN KEY (`type`) REFERENCES `gtType` (`type`)
) ENGINE=InnoDB;
Примечание1: такой KEY, как это будет создан автоматически, если это необходимо из-за определения FK в строке, которая следует за ним. Разработчик может пропустить его, и при необходимости добавится KEY (aka index). Пример того, что он пропускает разработчик, показан ниже в someOther
.
До сих пор так хорошо, пока не позвонил.
CREATE TABLE `someOther` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`someDT` datetime NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `someOther_dt` FOREIGN KEY (`someDT`) REFERENCES `getTogethers` (`eventDT`)
) ENGINE=InnoDB;
Код ошибки: 1215. Невозможно добавить ограничение внешнего ключа
В этом случае он не работает из-за отсутствия индекса в ссылочной таблице getTogethers
для обработки быстрого поиска eventDT
. Решить в следующем утверждении.
CREATE INDEX `gt_eventdt` ON getTogethers (`eventDT`);
Таблица getTogethers
была изменена, и теперь создание someOther
будет успешным.
На странице руководства MySQL с использованием ограничений FOREIGN KEY :
MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверки внешнего ключа могли быть быстрыми и не требовать сканирования таблицы. В таблице ссылок должен быть индекс, в котором столбцы внешнего ключа перечислены в качестве первых столбцов в том же порядке. Такой индекс создается в таблице ссылок автоматически, если он не существует.
Соответствующие столбцы внешнего ключа и ссылочного ключа должны иметь похожие типы данных. Размер и знак целочисленных типов должны быть одинаковыми. Длина типов строк не обязательно должна быть одинаковой. Для небинных (символьных) строковых столбцов набор символов и сопоставление должны быть одинаковыми.
InnoDB позволяет внешнему ключу ссылаться на любой индексный столбец или группу столбцов. Однако в ссылочной таблице должен быть индекс, в котором ссылочные столбцы указаны в качестве первых столбцов в том же порядке.
Обратите внимание, что последняя точка выше первых (самых левых) столбцов и отсутствие требования первичного ключа (хотя и очень рекомендуется).
После успешного создания таблицы реферирования (дочернего) все ключи, которые были автоматически созданы для вас, видны с помощью следующей команды:
SHOW CREATE TABLE someOther;
Другие распространенные случаи возникновения этой ошибки включают, как упоминалось выше, в документах, но должны быть выделены:
По-видимому тривиальные различия в
INT
который подписан, указывая наINT UNSIGNED
.Разработчики испытывают трудности с пониманием многоколоночных (составных) KEYS и первых (самых левых) требований к порядку.
1045 Доступ запрещен
См. Обсуждения в «ГРАНТ» и «Восстановление пароля root».
1236 «невозможное положение» в репликации
Обычно это означает, что Мастер разбился и этот sync_binlog
был выключен. Решение состоит в том, чтобы CHANGE MASTER to POS=0
следующего файла binlog (см. Мастер) в Slave.
Причина: Мастер отправляет элементы репликации в подчиненное устройство перед очисткой до его бинарного журнала (когда sync_binlog=OFF
). Если Мастер выйдет из строя до флеша, ведомый уже логически перемещается за конец файла в binlog. Когда мастер запускается снова, он запускает новый битблог, поэтому ПЕРЕЗАПУСК к началу этого бинарного журнала является наилучшим доступным решением.
Долгосрочное решение - sync_binlog=ON
, если вы можете позволить себе дополнительный ввод-вывод, который он вызывает.
(Если вы работаете с GTID, ...?)
2002, 2003 Не удается подключиться
Проверьте, заблокирован ли порт 3306 блокировки брандмауэра.
Некоторые возможные диагностические и / или решения
- Действительно ли сервер работает?
- «служба firewalld stop» и «systemctl disable firewalld»
- мастер telnet 3306
- Проверьте адрес
bind-address
- проверить
skip-name-resolve
- проверьте розетку.
1067, 1292, 1366, 1411 - Плохая стоимость для числа, даты, по умолчанию и т. Д.
1067 Это, вероятно, связано со значениями по умолчанию TIMESTAMP
, которые со временем изменились. См. TIMESTAMP defaults
на странице «Даты и времена». (которого еще нет)
1292/1366 DOUBLE / Integer Проверьте наличие букв или других синтаксических ошибок. Убедитесь, что столбцы выровнены; возможно, вы думаете, что ставите в VARCHAR
но выровнены с числовым столбцом.
1292 DATETIME Проверьте слишком далеко в прошлом или будущем. Проверяйте между 2:00 и 3:00 утром, когда смена летнего времени изменилась. Проверьте наличие сильного синтаксиса, например, +00
часовых поясов.
1292 ПЕРЕМЕННЫХ Проверьте допустимые значения для VARIABLE
вы пытаетесь SET
.
1292 LOAD DATA Посмотрите на строку, которая является «плохим». Проверьте escape-символы и т. Д. Посмотрите на типы данных.
1411 STR_TO_DATE Неверно отформатированная дата?
126, 127, 134, 144, 145
Когда вы пытаетесь получить доступ к записям из базы данных MySQL, вы можете получить эти сообщения об ошибках. Эти сообщения об ошибках произошли из-за повреждения в базе данных MySQL. Ниже приведены типы
MySQL error code 126 = Index file is crashed
MySQL error code 127 = Record-file is crashed
MySQL error code 134 = Record was already deleted (or record file crashed)
MySQL error code 144 = Table is crashed and last repair failed
MySQL error code 145 = Table was marked as crashed and should be repaired
Ошибка MySQL, вирусная атака, сбой сервера, неправильное завершение работы, поврежденная таблица - причина этой коррупции. Когда он становится поврежденным, он становится недоступным, и вы больше не можете обращаться к ним. Чтобы получить доступность, лучший способ получить данные из обновленной резервной копии. Однако, если у вас нет обновленной или какой-либо действительной резервной копии, вы можете перейти на восстановление MySQL.
Если тип движка таблицы - MyISAM
, примените CHECK TABLE
, а затем REPAIR TABLE
.
Тогда подумайте серьезно о преобразовании в InnoDB, поэтому эта ошибка больше не повторится.
Синтаксис
CHECK TABLE <table name> ////To check the extent of database corruption
REPAIR TABLE <table name> ////To repair table
139
Ошибка 139 может означать, что число и размер полей в определении таблицы превышают некоторый предел. обходные:
- Пересмотреть схему
- Нормализовать некоторые поля
- Вертикально разбить таблицу
1366
Обычно это означает, что обработка набора символов не была согласована между клиентом и сервером. См. ... для дальнейшей помощи.
126, 1054, 1146, 1062, 24
(с перерывом). С учетом этих четырех номеров ошибок, я думаю, эта страница охватит около 50% типичных ошибок, которые получат пользователи.
(Да, этот «пример» нуждается в пересмотре.)
24 Не удается открыть файл (слишком много открытых файлов)
open_files_limit
происходит из настройки ОС. table_open_cache
должен быть меньше этого.
Это может привести к ошибке:
Невозможность
DEALLOCATE PREPARE
в хранимой процедуре.PARTITIONed table (s) с большим количеством разделов и innodb_file_per_table = ON. Рекомендовать не иметь более 50 разделов в данной таблице (по разным причинам). (Когда «Родные разделы» станут доступными, этот совет может измениться.)
Очевидным обходным решением является увеличение ограничения ОС: разрешить больше файлов, изменить ulimit
или /etc/security/limits.conf
или в sysctl.conf
(kern.maxfiles & kern.maxfilesperproc) или что-то еще (зависит от ОС). Затем увеличьте open_files_limit
и table_open_cache
.
Начиная с 5.6.8 open_files_limit
автоматически open_files_limit
на основе max_connections
, но это нормально, чтобы изменить его по умолчанию.
1062 - Повторяющийся ввод
Эта ошибка возникает в основном из-за следующих двух причин
Дублируемое значение -
Error Code: 1062. Duplicate entry '12' for key 'PRIMARY'
Столбец первичного ключа уникален, и он не будет принимать дублируемую запись. Поэтому, когда вы пытаетесь вставить новую строку, которая уже присутствует в вашей таблице, это приведет к ошибке.
Чтобы решить эту проблему, установите столбец первичного ключа как
AUTO_INCREMENT
. И когда вы пытаетесь вставить новую строку, игнорируйте столбец первичного ключа или вставьте значениеNULL
в первичный ключ.
CREATE TABLE userDetails(
userId INT(10) NOT NULL AUTO_INCREMENT,
firstName VARCHAR(50),
lastName VARCHAR(50),
isActive INT(1) DEFAULT 0,
PRIMARY KEY (userId) );
--->and now while inserting
INSERT INTO userDetails VALUES (NULL ,'John', 'Doe', 1);
Уникальное поле данных -
Error Code: 1062. Duplicate entry 'A' for key 'code'
Вы можете назначить столбец как уникальный, и попытка вставить новую строку с уже существующим значением для этого столбца приведет к этой ошибке.
Чтобы преодолеть эту ошибку, используйте
INSERT IGNORE
вместо обычногоINSERT
. Если новая строка, которую вы пытаетесь вставить, не дублирует существующую запись, MySQL вставляет ее как обычно. Если запись является дубликатом, ключевое словоIGNORE
отбрасывает ее, не генерируя никаких ошибок.
INSERT IGNORE INTO userDetails VALUES (NULL ,'John', 'Doe', 1);