web-dev-qa-db-fra.com

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

J'essaye 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:

ERREUR 1064 (42000): vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser près de 'key) VALUES ('Tim', 'Florida', 42)' à la ligne 1.

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

48
Amal Murali

Le problème

Dans MySQL, certains mots comme SELECT, INSERT, DELETE etc. sont des mots réservés. Comme ils ont une signification particulière, MySQL la considère comme une erreur de syntaxe lorsque vous les utilisez comme nom de table, de colonne ou tout autre type d’identificateur - à moins que vous ne l'entouriez de pseudos.

Comme indiqué dans la documentation officielle, section 10.2 Noms d'objet de schéma (accentuation ajoutée):

Certains objets dans MySQL, notamment les noms de base de données, table, index, colonne, alias, vue, procédure stockée, partition, espace de table et autres sont appelés identificateurs = .

...

Si un identifiant contient des caractères spéciaux ou est un mot réservé, vous devez citez-le chaque fois que vous vous y référez.

...

Le caractère de citation de l'identifiant est le backtick ("` "):

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

  • AJOUTER
  • ET
  • AVANT
  • PAR
  • APPEL
  • CAS
  • ÉTAT
  • EFFACER
  • DESC
  • DÉCRIRE
  • DE
  • GROUPE
  • DANS
  • INDICE
  • INSÉRER
  • INTERVALLE
  • IS
  • CLÉ
  • COMME
  • LIMITE
  • LONGUE
  • RENCONTRE
  • NE PAS
  • OPTION
  • OR
  • ORDRE
  • CLOISON
  • RÉFÉRENCES
  • SÉLECTIONNER
  • TABLE
  • À
  • MISE À JOUR

La solution

Vous avez deux options.

1. N'utilisez pas de mots réservés comme identifiants

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

Cela présente quelques avantages:

  • Cela élimine la possibilité que vous ou un autre développeur utilisant votre base de données écrivez accidentellement une erreur de syntaxe en raison de l'oubli - ou de la non-connaissance - qu'un identificateur particulier est un mot réservé. MySQL contient de nombreux mots réservés et la plupart des développeurs ont peu de chances de tous les connaître. En n'utilisant pas ces mots en premier lieu, vous évitez de laisser des pièges à vous-même ou aux futurs développeurs.

  • Le moyen de citer des identifiants diffère selon les dialectes SQL. Alors que MySQL utilise des pseudonymes pour citer des identificateurs par défaut, le SQL conforme à ANSI (et même MySQL en mode ANSI SQL, comme indiqué ici ) utilise des guillemets doubles pour citer des identificateurs. En tant que telles, les requêtes qui citent des identifiants avec des guillemets sont moins faciles à transférer vers d'autres dialectes SQL.

Dans le seul but de réduire le risque d’erreurs futures, il s’agit généralement d’une action plus sage que de donner l’identifiant à l’arrière.

2. Utiliser des backticks

Si le changement de nom de la table ou de la colonne n’est pas possible, placez l’identificateur incriminé entre crochets (`) comme décrit dans la citation précédente de 10.2 Noms d'objet de schéma .

Un exemple pour illustrer l'utilisation (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 la même manière, la requête de la question peut être corrigée en encapsulant le mot clé key, comme indiqué ci-dessous:

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