Синтаксическая ошибка из-за использования зарезервированного слова в качестве имени таблицы или столбца в MySQL

Я пытаюсь выполнить простой запрос MySQL как показано ниже:

INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)

но я получаю следующую ошибку:

у вас ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом 'key) VALUES ('Tim', 'Florida', 42)' в строке 1

Как я могу исправить эту проблему?

1 ответов


Проблема

в MySQL некоторые слова, такие как SELECT, INSERT, DELETE etc. сдержанные слова. Поскольку они имеют особое значение, MySQL рассматривает его как синтаксическую ошибку всякий раз, когда вы используете их как имя таблицы, имя столбца или другой вид идентификатора - если вы не окружаете идентификатор обратными палочками.

как отмечено в официальных документах, в разделе 10.2 Имена Объектов Схемы (Курсив мой):

некоторые объекты в MySQL, включая базу данных, таблицу, индекс, столбец, псевдоним, представление, хранимую процедуру, раздел, табличное пространство и другие имена объектов известны как коды.

...

если идентификатор содержит специальные символы или зарезервированное слово, вы должны цитировать его всякий раз, когда вы ссылаетесь на него.

...

в символ цитаты идентификатора -backtick ("`"):

полный список ключевых слов и зарезервированных слов можно найти в разделе 10.3 ключевые слова и зарезервированные слова. На этой странице слова, за которыми следует "(R)", являются зарезервированными словами. Некоторые зарезервированные слова перечислены ниже, в том числе многие, которые имеют тенденцию вызывать это Решение

у вас есть два варианта.

1. Не используйте зарезервированные слова в качестве идентификаторов

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

это имеет несколько преимуществ:

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

  • средства кавычек отличается между диалектах SQL. Хотя MySQL использует backticks для цитирования идентификаторов по умолчанию, ANSI-совместимый SQL (и действительно MySQL в режиме ANSI SQL, как отмечено здесь) использует двойные кавычки для заключения в кавычки идентификаторов. Таким образом, запросы, которые цитируют идентификаторы с помощью backticks, менее легко переносятся на другие диалекты SQL.

чисто ради снижения риска будущих ошибок, это, как правило, более мудрый курс действий, чем backtick-цитирование идентификатора.

2. Использовать обратные кавычки

если переименование таблицы или столбца невозможно, оберните оскорбительный код в обратные апострофы (`), как описано в более ранней цитате из 10.2 Имена Объектов Схемы.

пример для демонстрации использования (взято из 10.3 ключевые слова и зарезервированные слова):

mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax.
near 'interval (begin INT, end INT)'

mysql> CREATE TABLE `interval` (begin INT, end INT);
Query OK, 0 rows affected (0.01 sec)

аналогично, запрос из вопроса может быть исправлен путем обертывания ключевого слова key в backticks, как показано ниже:

INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)";               ^   ^