Я пытаюсь выполнить простой запрос MySQL, как показано ниже:
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
Но я получаю следующую ошибку:
ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом
'key) VALUES ('Tim', 'Florida', 42)'
в строке 1
Как я могу исправить проблему?
В MySQL некоторые слова, такие как SELECT
, INSERT
, DELETE
и т.д. являются зарезервированными словами. Поскольку они имеют особое значение, MySQL рассматривает его как синтаксическую ошибку всякий раз, когда вы используете их в качестве имени таблицы, имени столбца или другого типа идентификатора — если только вы не окружите идентификатор обратными метками.
Как отмечено в официальных документах, в разделе 10.2 Имена объектов схемы (выделение добавлено):
Некоторые объекты в MySQL, включая базу данных, таблицу, индекс, столбец, псевдоним, представление, хранимую процедуру, раздел, табличное пространство и другие имена объектов, называются идентификаторы.
…
Если идентификатор содержит специальные символы или является зарезервированное слово, вы должен цитируйте это всякий раз, когда вы ссылаетесь на это.
…
Символом кавычки идентификатора является кавычка (»
`
«):
Полный список ключевых слов и зарезервированных слов можно найти в разделе 10.3 Ключевые слова и зарезервированные слова. На этой странице слова, за которыми следует «(R)», являются зарезервированными словами. Некоторые зарезервированные слова перечислены ниже, в том числе многие, которые имеют тенденцию вызывать эту проблему.
У вас есть два варианта.
Самое простое решение — просто избегать использования зарезервированных слов в качестве идентификаторов. Вероятно, вы можете найти другое разумное имя для вашей колонки, которое не является зарезервированным словом.
Делать это имеет пару преимуществ:
Это исключает возможность того, что вы или другой разработчик, использующий вашу базу данных, случайно напишут синтаксическую ошибку из-за того, что забыли или не знаете, что конкретный идентификатор является зарезервированным словом. В MySQL есть много зарезервированных слов, и большинство разработчиков вряд ли знают их все. Не используя эти слова в первую очередь, вы не оставляете ловушки для себя или будущих разработчиков.
Средство цитирования идентификаторов отличается в разных диалектах SQL. В то время как MySQL использует кавычки для цитирования идентификаторов по умолчанию, ANSI-совместимый SQL (и, действительно, MySQL в режиме ANSI SQL, как отмечалось) Вот) использует двойные кавычки для цитирования идентификаторов. Таким образом, запросы, заключающие идентификаторы в кавычки, менее легко переносимы на другие диалекты SQL.
Чисто ради уменьшения вероятности ошибок в будущем, это, как правило, более разумный курс действий, чем обратная кавычка идентификатора.
Если переименование таблицы или столбца невозможно, оберните ошибочный идентификатор в кавычки (`
) как описано в предыдущей цитате из 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
в кавычках, как показано ниже:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^
Других решений пока нет …