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

mysql reserved-words


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

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

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

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'key) VALUES ('Tim', 'Florida', 42)' в строке 1

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





Answer 1 Amal Murali


Проблема

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

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

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

...

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

...

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

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

  • ADD
  • AND
  • BEFORE
  • BY
  • CALL
  • CASE
  • CONDITION
  • DELETE
  • DESC
  • DESCRIBE
  • FROM
  • GROUP
  • IN
  • INDEX
  • INSERT
  • INTERVAL
  • IS
  • KEY
  • LIKE
  • LIMIT
  • LONG
  • MATCH
  • NOT
  • OPTION
  • OR
  • ORDER
  • PARTITION
  • REFERENCES
  • SELECT
  • TABLE
  • TO
  • UPDATE
  • WHERE

Решение

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

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

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

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

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

  • Средство цитирования идентификаторов отличается в разных диалектах SQL. В то время как MySQL использует кавычки для цитирования идентификаторов по умолчанию, ANSI-совместимый SQL (и, действительно, MySQL в режиме ANSI SQL, как отмечено здесь ) использует двойные кавычки для цитирования идентификаторов. Таким образом, запросы, заключающие идентификаторы в кавычки, менее легко переносимы на другие диалекты 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)

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

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