J'essaie d'exécuter une simple requête MySQL comme celle-ci :
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 de la version de votre serveur MySQL pour connaître la syntaxe correcte à utiliser près de la ligne 1
'key) VALUES ('Tim', 'Florida', 42)'
Comment résoudre ce problème ?
Question
Dans MySQL, certains mots tels que
SELECT
、INSERT
、DELETE
sont des mots réservés. Parce qu'ils ont une signification particulière, MySQL la traite comme une erreur de syntaxe chaque fois que vous les utilisez comme noms de tables, noms de colonnes ou autres types d'identifiants - à moins que vous ne mettiez l'identifiant entre des guillemets.Comme indiqué dans la documentation officielle, dans 10.2 noms d'objets de schéma em> (c'est nous qui soulignons) :
La liste complète des mots-clés et 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 à provoquer ce problème.
Solution
Vous avez deux options.
1. N'utilisez pas de mots réservés comme identifiants
La solution la plus simple est d'éviter d'utiliser des mots réservés comme identifiants. Vous pourrez peut-être trouver un autre nom raisonnable pour votre colonne qui ne soit pas un mot réservé.
Il y a plusieurs avantages à faire cela :
Cela élimine la possibilité que vous ou d'autres développeurs travaillant avec la base de données écriviez accidentellement des erreurs de syntaxe parce qu'ils ont oublié ou ne savaient pas qu'un identifiant spécifique était 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 créer des pièges pour vous-même ou pour les futurs développeurs.
La façon dont les identifiants sont cités diffère selon les dialectes SQL. Alors que MySQL utilise des backticks pour citer les identifiants par défaut, le SQL conforme à ANSI (en fait MySQL en mode ANSI SQL, comme décrit ici) ) utilise des guillemets doubles pour citer les identifiants. Par conséquent, les requêtes qui utilisent des backticks pour citer les identifiants sont moins 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 approche plus intelligente que le backticking des identifiants.
2. Utilisez le backtick
Si la table ou la colonne ne peut pas être renommée, entourez l'identifiant en question entre des guillemets (
`
), comme dans le 10.2 Schema Object Name cité précédemment.Exemple démontrant l'utilisation (tiré de 10.3 Mots-clés et mots réservés) :
Encore une fois, la requête dans la question peut être corrigée en enveloppant le mot-clé
key
entre des guillemets, comme ceci :