Erreur de syntaxe due à l'utilisation d'un mot réservé comme nom de table ou de colonne dans MySQL

j'essaie d'exécuter une simple requête MySQL comme ci-dessous:

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

Mais j'obtiens l'erreur suivante:

vous avez une erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à la version de votre serveur MySQL pour la syntaxe à utiliser près de 'key) VALUES ('Tim', 'Florida', 42)' à la ligne 1

Comment puis-je régler le problème?

48
demandé sur Amal Murali 2014-05-03 19:29:22

1 réponses

Le Problème

en MySQL, certains mots comme SELECT , INSERT , DELETE etc. sont des mots réservés. Puisqu'ils ont une signification spéciale, MySQL le traite comme une erreur de syntaxe chaque fois que vous les utilisez comme un nom de table, un nom de colonne, ou un autre type d'identifiant - à moins que vous entouriez l'identifiant avec des backticks.

comme indiqué dans les documents officiels, dans la section 10.2 noms D'objets Schema (non souligné dans l'original):

Certains objets dans MySQL, y compris base de données, table, index, colonne, alias, vue, procédure stockée, partition, tablespace, et d'autres noms d'objets sont connus comme identificateurs .

...

si un identificateur contient des caractères spéciaux ou est un mot réservé , vous devez le citer chaque fois que vous vous y référez.

...

le caractère d'identification de soumission est le backtick (" ` "):

une liste complète de mots clés et de mots réservés se trouve dans la section 10.3 mots clés et mots réservés . Dans cette page, les mots suivis de "(R)" sont réservés. Certains mots réservés sont énumérés ci-dessous, y compris plusieurs qui ont tendance à causer ce problème.

  • ajouter
  • et
  • avant
  • par
  • CALL
  • CASE
  • CONDITION
  • supprimer
  • DESC
  • décrire
  • de
  • groupe
  • IN
  • INDEX
  • insérer
  • intervalle
  • est
  • clé
  • LIKE
  • limite
  • LONG
  • MATCH
  • NOT
  • OPTION
  • ou
  • ordre
  • PARTITION
  • REFERENCES
  • sélectionner
  • TABLE
  • à
  • UPDATE

La Solution

vous avez deux options.

1. N'utilisez pas les mots réservés comme identificateurs

la solution la plus simple est pour éviter d'utiliser des mots réservés comme des identificateurs. Vous pouvez probablement trouver un autre nom raisonnable pour votre colonne qui n'est pas un mot réservé.

faire ceci a quelques avantages:

  • il élimine la possibilité que vous ou un autre développeur utilisant votre base de données écrive accidentellement une erreur de syntaxe due à l'oubli - ou ne pas savoir - qu'un identifiant particulier est un mot réservé. Il ya beaucoup de Réservé les mots dans MySQL et la plupart des développeurs sont peu susceptibles de les connaître tous. En n'utilisant pas ces mots, en premier lieu, vous évitez de laisser des pièges pour vous-même ou futurs développeurs.

  • les moyens de citer des identificateurs diffèrent entre les dialectes SQL. Alors que MySQL utilise des Rétro-balises pour citer des identificateurs par défaut, ANSI-compliant SQL (et en effet MySQL en mode ANSI SQL, comme noté ici ) utilise des guillemets doubles pour citer des identificateurs. Ainsi, les requêtes qui citent des identificateurs avec des bâtons arrière sont moins facilement transférables vers d'autres dialectes SQL.

purement dans le but de réduire le risque d'erreurs futures, il s'agit habituellement d'une ligne de conduite plus sage que le point de référence-citant l'identificateur.

2. Use matériau de construction

si le changement de nom de la table ou de la colonne n'est pas possible, envelopper l'identificateur offensant dans des bâtons ( ` ) comme décrit dans la citation précédente de 10.2 noms D'objet Schema .

un exemple pour démontrer l'usage (tiré de 10.3 mots clés et mots réservés ):

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)

de même, la requête à partir de la question peut être corrigée en enveloppant le mot-clé key dans des Rétro-balises, comme indiqué ci-dessous:

INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)";               ^   ^
220
répondu Amal Murali 2017-05-23 11:55:11