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

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

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

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

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

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

    Проблема

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

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

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

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

    Символом кавычки идентификатора является обратная сторона (” ` “):

    Полный список ключевых слов и зарезервированных слов можно найти в разделе 10.3 Ключевые слова и зарезервированные слова . На этой странице слова, за которыми следует «(R)», являются зарезервированными словами. Ниже перечислены некоторые зарезервированные слова, в том числе многие, которые, как правило, вызывают эту проблему.

    • ДОБАВИТЬ
    • А ТАКЖЕ
    • ДО
    • ОТ
    • ВЫЗОВ
    • ДЕЛО
    • СОСТОЯНИЕ
    • УДАЛИТЬ
    • DESC
    • ОПИСАНИЯ
    • ИЗ
    • GROUP
    • В
    • ИНДЕКС
    • ВСТАВИТЬ
    • ИНТЕРВАЛ
    • ЯВЛЯЕТСЯ
    • KEY
    • КАК
    • ПРЕДЕЛ
    • ДЛИННЫЙ
    • СОВПАДЕНИЕ
    • НЕ
    • ВАРИАНТ
    • ИЛИ
    • ЗАКАЗ
    • PARTITION
    • РЕКОМЕНДАЦИИ
    • ВЫБРАТЬ
    • ТАБЛИЦА
    • К
    • ОБНОВИТЬ
    • ГДЕ

    Решение

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

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

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

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

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

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

    Чисто ради уменьшения риска будущих ошибок, это обычно более разумный курс действий, чем обратная ссылка на идентификатор.

    2. Используйте обратные сигналы

    Если переименование таблицы или столбца невозможно, заверните оскорбительный идентификатор в backticks ( ` ), как описано в предыдущей цитате из 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) 

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

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

    boost :: flat_map и его производительность по сравнению с картой и unordered_map

    Cloned XP не будет загружаться должным образом – застрял перед выбором экрана входа / выбора пользователя

    как сделать программный снимок экрана для iPhone?

    Загрузите загрузочный контент Bootstrap с помощью AJAX. Это возможно?

    Сортировка ArrayList массива в Java

    Select2 не работает, если он встроен в загрузочный модальный

    Какие очереди в jQuery?

    Android: изменение размера только частей изображения с помощью мягкой клавиатуры на экране

    Как считать все строки кода в каталоге рекурсивно?

    Какие API в Android используются Facebook для создания чат-голов?

    Как определить обратные вызовы в Android?

    Как мне общаться с моим другом на ПК, делиться своим экраном и звуком игры, не смешивая их голос?

    УдалитьAll для ObservableCollections?

    Какова цель вопросительного знака после типа (например: int? MyVariable)?

    Что произойдет, если вы добавите графическую карту в i7 со встроенной графикой (например, HD 4000)

    Давайте будем гением компьютера.