Синтаксическая ошибка из-за использования зарезервированного слова в качестве имени таблицы или столбца в 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)"; ^ ^