Mysql
 sql >> Base de données >  >> RDS >> Mysql

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

Le problème

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

Comme indiqué dans la documentation officielle, dans la section 10.2 Schema Object Names (soulignement ajouté) :

Certains objets dans MySQL, y compris la base de données, la table, l'index, la colonne, l'alias, la vue, la procédure stockée, la partition, l'espace de table et d'autres noms d'objet sont appelés identifiants .

...

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

...

Le guillemet de l'identifiant est le backtick ("` "):

Une liste complète des mots clés et des 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 des mots réservés. Certains mots réservés sont répertoriés ci-dessous, dont beaucoup ont tendance à causer ce problème.

  • AJOUTER
  • ET
  • AVANT
  • PAR
  • APPEL
  • CAS
  • ÉTAT
  • SUPPRIMER
  • DESC
  • DÉCRIRE
  • DE
  • GROUPE
  • EN
  • INDICE
  • INSÉRER
  • INTERVALLE
  • EST
  • CLÉ
  • J'AIME
  • LIMITER
  • LONG
  • MATCH
  • PAS
  • OPTION
  • OU
  • COMMANDE
  • PARTITION
  • CLASSEMENT
  • RÉFÉRENCES
  • SÉLECTIONNER
  • TABLEAU
  • À
  • 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 identifiants. Vous pouvez probablement trouver un autre nom raisonnable pour votre colonne qui ne soit pas un mot réservé.

Cela présente plusieurs avantages :

  • Cela élimine la possibilité que vous ou un autre développeur utilisant votre base de données écriviez accidentellement une erreur de syntaxe en oubliant - ou en ne sachant pas - qu'un identifiant particulier est un mot réservé. Il existe de nombreux mots réservés dans MySQL et il est peu probable que la plupart des développeurs les connaissent tous. En n'utilisant pas ces mots en premier lieu, vous évitez de laisser des pièges à vous-même ou aux futurs développeurs.

  • Les moyens de citer les identificateurs diffèrent entre les dialectes SQL. Alors que MySQL utilise des backticks pour citer les identifiants par défaut, SQL conforme à ANSI (et en effet MySQL en mode SQL ANSI, comme indiqué ici ) utilise des guillemets doubles pour citer les identificateurs. En tant que telles, les requêtes qui citent des identifiants avec des backticks sont moins facilement portables 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 ligne de conduite plus sage que de citer l'identifiant avec des backtickets.

2. Utilisez des backticks

S'il n'est pas possible de renommer la table ou la colonne, enveloppez l'identifiant incriminé de backticks (` ) comme décrit dans la citation précédente de 10.2 Schema Object Names .

Un exemple pour démontrer 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 même, la requête de la question peut être corrigée en enveloppant le mot-clé key en backticks, comme indiqué ci-dessous :

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