Error 1064 mysql foreign key

Learn how to fix the 1064 MySQL error in this article.

So, you’re creating a custom SQL query to perform a task in the database. After putting the code together and running it in PHPmyAdmin it responds with a 1064 error. It may look similar to this:

1064 error message

The 1064 error displays any time you have an issue with your SQL syntax, and is often due to using reserved words, missing data in the database, or mistyped/obsolete commands. So follow along and learn more about what the 1064 error is, some likely causes, and general troubleshooting steps.

Note: Since syntax errors can be hard to locate in long queries, the following online tools can often save time by checking your code and locating issues:

  • PiliApp MySQL Syntax Check
  • EverSQL SQL Query Syntax Check & Validator

Causes for the 1064 error

  • Reserved Words
  • Missing Data
  • Mistyped Commands
  • Obsolete Commands

This may seem cryptic since it is a general error pointing to a syntax issue in the SQL Query statement. Since the 1064 error can have multiple causes, we will go over the most common things that will result in this error and show you how to fix them. Follow along so you can get your SQL queries updated and running successfully.

Using Reserved Words

Every version of MySQL has its own list of reserved words. These are words that are used for specific purposes or to perform specific functions within the MySQL engine. If you attempt to use one of these reserved words, you will receive the 1064 error. For example, below is a short SQL query that uses a reserved word as a table name.

CREATE TABLE alter (first_day DATE, last_day DATE);

How to fix it:

Just because the word alter is reserved does not mean it cannot be used, it just has special requirements to use it as the MySQL engine is trying to call the functionality for the alter command. To fix the issue, you will want to surround the word with backticks, this is usually the button just to the left of the “1” button on the keyboard. The code block below shows how the code will need to look in order to run properly.

CREATE TABLE `alter` (first_day DATE, last_day DATE);

Missing Data

Sometimes data can be missing from the database. This causes issues when the data is required for a query to complete. For example, if a database is built requiring an ID number for every student, it is reasonable to assume a query will be built to pull a student record by that ID number. Such a query would look like this:

SELECT * from students WHERE studentID = $id

If the $id is never properly filled in the code, the query would look like this to the server:

SELECT * from students WHERE studentID =

Since there is nothing there, the MySQL engine gets confused and complains via a 1064 error.

How to fix it:

Hopefully, your application will have some sort of interface that will allow you to bring up the particular record and add the missing data. This is tricky because if the missing data is the unique identifier, it will likely need that information to bring it up, thus resulting in the same error. You can also go into the database (typically within phpMyAdmin) where you can select the particular row from the appropriate table and manually add the data.

Mistyping of Commands

One of the most common causes for the 1064 error is when a SQL statement uses a mistyped command. This is very easy to do and is easily missed when troubleshooting at first. Our example shows an UPDATE command that is accidentally misspelled.

UDPATE table1 SET id = 0;

How to fix it:

Be sure to check your commands prior to running them and ensure they are all spelled correctly.

Below is the syntax for the correct query statement.

UPDATE table1 SET id = 0;

Obsolete Commands

Some commands that were deprecated (slated for removal but still allowed for a period of time) eventually go obsolete. This means that the command is no longer valid in the SQL statement. One of the more common commands is the ‘TYPE‘ command. This has been deprecated since MySQL 4.1 but was finally removed as of version 5.1, where it now gives a syntax error. The ‘TYPE‘ command has been replaced with the ‘ENGINE‘ command. Below is an example of the old version:

CREATE TABLE t (i INT) TYPE = INNODB;

This should be replaced with the new command as below:

CREATE TABLE t (i INT) ENGINE = INNODB;

For developers or sysadmins experienced with the command line, get High-Availability and Root Access for your application, service, and websites with Cloud VPS Hosting.

Error 1064 Summary

As you can see there is more than one cause for the 1064 error within MySQL code. Now, you know how to correct the issues with your SQL Syntax, so your query can run successfully. This list will be updated as more specific instances are reported.

Код ошибки 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 — Повторяющийся ввод

Эта ошибка возникает в основном из-за следующих двух причин

  1. Дублируемое значение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);
  1. Уникальное поле данныхError Code: 1062. Duplicate entry 'A' for key 'code'

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

Чтобы преодолеть эту ошибку, используйте INSERT IGNORE вместо обычного INSERT . Если новая строка, которую вы пытаетесь вставить, не дублирует существующую запись, MySQL вставляет ее как обычно. Если запись является дубликатом, ключевое слово IGNORE отбрасывает ее, не генерируя никаких ошибок.

INSERT IGNORE INTO userDetails VALUES (NULL ,'John', 'Doe', 1);

This is an article where mainly written to discuss an error generated when a certain query command is being executed. The query command executed is personally executed in a MySQL Command Console. It can also carried out in a MySQL Editor based on GUI. The query command is specifically performed to add a foreign key in the database. It is performed and executed but the execution itself is failed and MySQL generated an error as specified in the title. The error message is ERROR 1064(42000): You have an error in your SQL syntax. Below is an example of the query executed in MySQL Command Console which is primarily carried out to add foreign key :

mysql> alter table server_db add constraint fk_db_server foreign_key(id_server) references server(id_server) on update cascade on delete cascade;

The above query is a query which is used to add foreign key specifically can be seen in an article titled ‘MySQL Add Foreign Key in MySQL Command Console’ which can be seen in the following link.

Since the error specified is actually given the main focus of the error which is ‘You have an error in your SQL syntax’, the first step for solving and handling the error is actually trying to find the incorrect syntax involving the query for adding foreign key. As shown in the article titled ‘MySQL Add Foreign Key in MySQL Command Console’ in this link, there is an incorrect syntax of the SQL syntax for the query specified above. It is actually in the following reserved keyword ‘foreign_key’. As shown in the article stated previously, the correct keyword which is reserved for adding foreign key is actually ‘foreign key’.

So, to solve the above problem, just change the SQL syntax query into the following query :

mysql> alter table server_db add constraint fk_db_server foreign key(id_server) references server(id_server) on update cascade on delete cascade;

The execution process which is successfully carried out can be seen as the following process :

mysql> alter table server_db add constraint fk_db_server foreign key(id_server) references server(id_server) on update cascade on delete cascade; Query OK, 0 rows affected (0,03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>

Below is the diagram of Entity Relationship Diagram which is specifically shows the relationship for adding a new foreign key :

If you’ve been using WordPress for a while, you may have decided to get into more advanced database management. This often involves using the MySQL command line, which can, in turn, lead to confusing problems such as MySQL 1064 errors.

Fortunately, while resolving this error can be confusing at first due to its many potential causes, its solutions tend to be relatively simple. Once you determine the reason behind the database error you’re seeing, you should be able to fix it fairly quickly.

In this post, we’ll cover the various possible causes of the MySQL 1064 error. Then we’ll share solutions for each common situation, to help you get your database and your site back up and running.

Let’s get started!

Why the MySQL 1064 Error Occurs

The MySQL 1064 error is a syntax error. This means the reason there’s a problem is because MySQL doesn’t understand what you’re asking it to do. However, there are many different situations that can lead to this type of miscommunication between you and your database.

The simplest cause is that you’ve made a mistake while typing in a command and MySQL can’t understand your request. Alternatively, you may be attempting to use outdated or even obsolete commands that can’t be read.

In other cases, you may have attempted to include a ‘reserved word’ in one of your commands. Reserved words are terms that can only be used in specific contexts in MySQL. If you attempt to use them in other ways, you’ll be faced with an error.

It’s also possible that there is some data missing from your database. When you make a request via MySQL which references data that isn’t where it’s supposed to be, you’ll also see the 1064 error. Finally, transferring your WordPress database to another server can also lead to the same issue.

As you can see, there are many potential causes for this problem, which can make it tricky to resolve. Unless you’re in the process of moving your database or taking some other action that points to a specific cause, you’ll likely need to try a few different solutions before you land on the right one. Fortunately, none of them are too difficult to execute, as we’ll see next.

Oh no, you’re getting the MySQL 1064 Error…😭 Don’t despair! Here are 5 proven solutions to get it fixed immediately 🙏Click to Tweet

How to Fix the MySQL 1064 Error (5 Methods)

If you already have an idea of what’s causing your MySQL 1064 error, you can simply skip down to the resolution for your specific situation. However, if you’re not sure why the error has occurred, the simplest strategy is to try the easiest solution first.

In that case, we’d suggest testing out the five most likely fixes in the following order.

1. Correct Mistyped Commands

The good thing about MySQL typos is that they’re the simplest explanation for syntax issues such as the 1064 error. Unfortunately, they can also be the most tedious to correct. Generally speaking, your best option is to manually proofread your code and look for any mistakes you may have made.

We suggest using the MySQL Manual as a reference while you do so, double-checking anything you’re not sure about. As you might imagine, this can get pretty time-consuming, especially if you’ve been working in the MySQL command line for a while or if you’re new to this task.

An alternative to manually checking your work is to employ a tool such as EverSQL:

MySQL 1064 Error: EverSQL syntax checker

EverSQL syntax checker

With this solution, you can simply input your MySQL to check for errors automatically. However, keep in mind that these platforms aren’t always perfect and you may still want to validate the results yourself.

2. Replace Obsolete Commands

As platforms grow and change, some commands that were useful in the past are replaced by more efficient ones. MySQL is no exception. If you’re working on your database following a recent update or have referenced an outdated source during your work, it’s possible that one or more of your commands are no longer valid.

You can check to see whether this is the case using the MySQL Reference Manual. You’ll find mentions of commands that have been made obsolete by each MySQL version in the relevant sections:

MySQL 1064 Error: Manually removing obsolete commands

Manually removing obsolete commands

Once you’ve determined which command is likely causing the problem, you can simply use the ‘find and replace’ function to remove the obsolete command and add in the new version. For example, if you were using storage_engine and find that it no longer works, you could simply replace all instances with the new default_storage_engine command.

3. Designate Reserved Words

In MySQL, using a reserved word out of context will result in a syntax error, as it will be interpreted as incorrect. However, you can still use reserved words however you please by containing them within backticks, like this: `select`

Each version of MySQL has its own reserved words, which you can read up on in the MySQL Reference Manual. A quick find and replace should enable you to resolve this issue if you think it may be causing your 1064 error.

4. Add Missing Data

If your latest MySQL query attempts to reference information in a database and can’t find it, you’re obviously going to run into problems. In the event that none of the preceding solutions resolves your MySQL 1064 error, it may be time to go looking for missing data.

Unfortunately, this is another solution that can be quite tedious and has to be done by hand. The best thing you can do in this situation is to work backward, starting with your most recent query. Check each database it references, and make sure all the correct information is present. Then move on to the next most recent query, until you come to the one that’s missing some data.

5. Use Compatibility Mode to Transfer WordPress Databases

This final 1064 error solution isn’t as straightforward as the others on our list. However, if you’re migrating your WordPress site to a new host or otherwise moving it to a different server, you’ll need to take extra steps to avoid causing problems with your database.

The simplest solution is to use a migration plugin that includes a compatibility mode, such as WP Migrate DB:

WP Migrate DB WordPress plugin

WP Migrate DB WordPress plugin

This will enable an auto-detection feature that will make sure your latest site backup and database are compatible with multiple versions of MySQL. You can access the compatibility mode setting by navigating to Tools > Migrate DB > Advanced Options:

WP Migrate DB settings

WP Migrate DB settings

Check the box next to Compatible with older versions of MySQL before starting your site migration. This way, you should be able to avoid any issues during the process.

Summary

Database errors can throw a wrench in your plans, and may even compromise your website’s stability. Knowing how to resolve issues such as the MySQL 1064 error can help you react quickly, and minimize downtime on your site.

There are five methods you can try to fix the MySQL 1064 error when you encounter it, depending on its most likely cause:

  1. Correct mistyped commands.
  2. Replace obsolete commands.
  3. Designate reserved words.
  4. Add missing data.
  5. Transfer WordPress databases in compatibility mode.

Get all your applications, databases and WordPress sites online and under one roof. Our feature-packed, high-performance cloud platform includes:

  • Easy setup and management in the MyKinsta dashboard
  • 24/7 expert support
  • The best Google Cloud Platform hardware and network, powered by Kubernetes for maximum scalability
  • An enterprise-level Cloudflare integration for speed and security
  • Global audience reach with up to 35 data centers and 275 PoPs worldwide

Test it yourself with $20 off your first month of Application Hosting or Database Hosting. Explore our plans or talk to sales to find your best fit.

Дата: 25.11.2013

Автор: Василий Лукьянчиков , vl (at) sqlinfo (dot) ru

Статья ориентирована на новичков. В ней объясняется, что означает ошибка сервера MySQL №1064, рассматриваются типичные ситуации и причины возникновения этой ошибки, а также даются рекомендации по исправлению.

Рассмотрим простейший пример.

SELECT mid, time, title, artist, download, view_count, rating, vote_num FROM dle_mservice WHERE category = ‘1’ AND approve = ‘1’ ORDER BY time DESC LIMIT -10,10;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘-10,10’ at line 1

Сервер MySQL сообщает, что в первой строке нашего SQL запроса имеется синтаксическая ошибка, и в одинарных кавычках цитирует часть запроса с того места где начинается ошибка. Это очень полезное свойство, так как позволяет сразу определить место, которое сервер счел ошибочным. В данном случае это ‘-10,10’, ошибка возникает из-за того, что параметр LIMIT не может быть отрицательным числом.

Однако, бывает и так, что цитируемый кусок запроса не содержит синтаксической ошибки. Это означает, что данная часть запроса находится не на своем месте из-за чего весь запрос становится синтаксически неверным. Например, отсутствует разделитель между двумя запросами, пропущен кусок запроса, невидимый символ в дампе и т.д. Неудобством таких ситуаций является то, что сообщение об ошибке не содержит исходный запрос.
Действия по исправлению зависят от контекста возникновения ошибки. Таковых всего 3:

1. Запрос в редакторе.

Самый простейший случай — вы пишите свой запрос в редакторе. Если причина не опечатка, то:

  • Смотреть в документации синтаксис команды для вашей версии сервера MySQL.

    Обратите внимание: речь идет о версии сервера MySQL, а не клиента (phpmyadmin, workbench и т.д.). Версию сервера можно узнать выполнив команду select version();

  • В MySQL допускается использование ключевых слов в качестве имен столбцов/таблиц, но при этом их необходимо заключать в обратные кавычки (там где буква ё на клавиатуре).
    Пример:

    select order from test;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘order from test’ at line 1
    MariaDB [test]> select `order` from test;
    +——-+
    | order |
    +——-+
    |  NULL |
    +——-+

  • По умолчанию ; разделяет команды. Если же нужно выполнить набор из нескольких инструкций как одну команду (например, при создании процедур, фунуций, триггеров), то в зависимости от используемого клиента может потребоваться переопределить разделитель с помощью DELIMITER, иначе интерпретация команды остановится на первой ; и будет ошибка синтаксиса. Пример:

    delimiter //
    create procedure test()
    begin
    set @a=1;
    select @a;
    end//

    Обратите внимание: DELIMITER это команда консольного клиента mysql, необходимость его использования зависит от того как вы передаете команду серверу. Например,:

    • mysql_query() выполняет содержимое как одну команду, добавление delimiter приведет к error 1064 с цитатой, начинающейся со слова delimiter
    • phpmyadmin удаляет слово delimiter из-за чего возникает error 1064 с цитатой, начинающейся с переопределенного разделителя
    • в MysqlQueryBrowser напротив необходимо использовать delimiter.

2. Перенос базы на другой сервер.

У вас есть дамп (т.е. файл с расширением .sql) и при попытке его импортировать вы получаете ошибку 1064. Причины:

  • В различных версиях набор ключевых слов и синтаксис может немного отличаться. Наиболее распространенный случай: команда create table, в которой ключевое слово type было заменено на engine. Например, если вы получаете ошибку:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘TYPE=MyISAM CHARACTER SET `utf8`’ at line 29

    Это означает, что вы переносите базу в пятую версию сервера MySQL, в котором ключевое слово TYPE не поддерживается и его нужно заменить на ENGINE.

    Редко бываю случаи, когда перенос идет на старый (~3.23) сервер, который кодировки не поддерживает. Тогда ошибка будет иметь вид:

    #1064 — You have an error in your SQL syntax near ‘DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci’ at line 1

    Такое может произойти, если вы переносите базу с хостинга на локальный комп, где стоит древняя версия MySQL. Лучшим решением в данном случае будет не править дамп, а обновить MySQL.

  • Часто проблемы вызваны тем, что дамп делается неродными средствами MySQL (например, phpmyadmin) из-за чего в нем могут быть BOM-маркер, собственный синтаксис комментариев, завершения команды и т.д. Кроме того при использовании того же phpmyadmin возможна ситуация при которой из-за ограничения апача на размер передаваемого файла команда будет обрезана, что приведет к ошибке 1064.
    Например, если вы получаете ошибку:

    #1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘
    CREATE TABLE `jos_banner` (
      `bid` int(11) NOT NULL auto_increment,
      `ci‘ at line 1

    Значит ваш дамп содержит BOM-маркер. Это три байта в начале файла, помогающие программе определить что данный файл сохранен в кодировке UTF-8. Проблема в том, что MySQL пытается интерпретировать их как команду из-за чего возникает ошибка синтаксиса. Нужно открыть дамп в текстовом редакторе (например, Notepad++) и сохранить без BOM.

    Для избежания подобных проблем при создании дампа и его импорте лучше пользоваться родными средствами MySQL, см http://sqlinfo.ru/forum/viewtopic.php?id=583

3. Некорректная работа сайта.

Если во время работы сайта появляются ошибки синтаксиса, то, как правило, причина в установке вами сомнительных модулей к вашей cms. Лучшее решение — отказаться от их использования. Еще лучше предварительно проверять их работу на резервной копии.

Пример. Движок dle 7.2, поставили модуль ,вроде бы все Ок, но:

MySQL Error!
————————
The Error returned was:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘AND approve=’1‘ AND date < ‘2008-10-04 04:34:25‘ LIMIT 5’ at line 1

Error Number:
1064
SELECT id, title, date, category, alt_name, flag FROM dle_post WHERE MATCH (title, short_story, full_story, xfields, title) AGAINST (‘Приобретение и оплата скрипта ‘) AND id !=  AND approve=‘1’ AND date < ‘2008-10-04 04:34:25’ LIMIT 5

В данном примере мы видим, что причина ошибки в отсутствии значения после «id != «

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

Кусок кода, который отвечает за данный запрос это

$db->query («SELECT id, title, date, category, alt_name, flag FROM « . PREFIX . «_post WHERE MATCH (title, short_story, full_story, xfields, title) AGAINST (‘$body’) AND id != «.$row[‘id’].» AND approve=’1′».$where_date.» LIMIT «.$config[‘related_number’]);

Далее можно искать откуда взялась переменная $row и почему в ней нет элемента ‘id’ и вносить исправления, но лучше отказаться от использования такого модуля (неизвестно сколько сюрпризов он еще принесет).

P.S. Если после прочтения статьи ваш вопрос с MySQL Error 1064 остался нерешенным, то задавайте его на форуме SQLinfo

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

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

#mysql #database #alter

#mysql #База данных #изменить

Вопрос:

Я продолжаю получать эту ошибку sql

 "#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Option (OptionId)' at line 1"
 

когда я пытаюсь добавить внешний ключ в поле OptionId из таблицы вопросов в поле OptionId (pk) в поле Option. Я не понимаю, почему я продолжаю получать ошибку, потому что я не вижу, что с ней не так.

Ниже приведено ограничение внешнего ключа с использованием ALTER TABLE:

 ALTER TABLE Question ADD CONSTRAINT FK_OptionId FOREIGN KEY (OptionId) REFERENCES Option (OptionId)
 

Имена таблиц и синтаксис верны, я убедился в этом путем двойной проверки.

Почему это не работает?

Комментарии:

1. # 1064, похоже, является общим сообщением mysql, в котором речь идет об ограничениях. я получил это при попытке СОЗДАТЬ ВНЕШНИЙ КЛЮЧ в существующей таблице (ржавый!). ваш вопрос напомнил мне, что мне пришлось ИЗМЕНИТЬ ТАБЛИЦУ. итак, я проголосовал за вас. спасибо!

Ответ №1:

option является зарезервированным словом в MySQL и должно быть окружено обратными метками.

 ALTER TABLE Question
    ADD CONSTRAINT FK_OptionId FOREIGN KEY (OptionId)
    REFERENCES `Option` (OptionId)
 

Комментарии:

1. Большое спасибо, я не знал, что option уже является резервным словом, спасибо

2. символ «`» также позволяет использовать более широкий набор символов при именовании переменных и таблиц, включая ПРОБЕЛЫ. исходя из стиля и процедуры, я бы предпочел не использовать его («` «) и попросил MySQL проверить целостность имени для меня (что становится ДЕЙСТВИТЕЛЬНО необходимым, если вы переносите свою БД на другой DBEngine). слава MichaelMior

Я продолжаю получать эту ошибку sql

"#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Option (OptionId)' at line 1"

когда я пытаюсь добавить внешний ключ в поле OptionId из таблицы вопросов в поле OptionId (pk) в поле Option. Я не понимаю, почему я продолжаю получать ошибку, потому что не вижу, что с ней не так.

Ниже показано ограничение внешнего ключа с использованием ALTER TABLE:

ALTER TABLE Question ADD CONSTRAINT FK_OptionId FOREIGN KEY (OptionId) REFERENCES Option (OptionId)

Имена таблиц и синтаксис верны, в чем я убедился, дважды проверив.

Почему не работает?

1 ответы

option — это зарезервированное слово в MySQL и должен быть окружен обратными кавычками.

ALTER TABLE Question
    ADD CONSTRAINT FK_OptionId FOREIGN KEY (OptionId)
    REFERENCES `Option` (OptionId)

ответ дан 21 окт ’11, 19:10

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

mysql
database
alter

or задайте свой вопрос.

Понравилась статья? Поделить с друзьями:
  • Error 1064 42000 ошибка
  • Error 1064 42000 you have an error in your sql syntax check the manual that
  • Error 1064 42000 no enabled local indexes to search
  • Error 1064 42000 mysqldump
  • Error 1064 42000 mysql как исправить