Le problème
Dans MySQL, certains mots comme SELECT
, INSERT
, DELETE
etc. sont des mots réservés. Puisqu'ils ont une signification spéciale, MySQL 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 avec des backticks.
Comme indiqué dans les documents officiels, dans la section 10.2 Noms des objets du schéma (accentuation ajoutée) :
Certains objets de MySQL, notamment la base de données, la table, l'index, la colonne, l'alias, la vue, la procédure stockée, la partition, le tablespace et d'autres noms d'objets sont connus sous le nom de identifiants .
...
Si un identifiant contient des caractères spéciaux ou est un mot réservé vous doit le citer chaque fois que vous y faites référence.
...
Le caractère de citation 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 énumérés ci-dessous, y compris ceux qui ont tendance à causer ce problème.
- ADD
- ET
- AVANT
- PAR
- APPELEZ
- CASE
- CONDITION
- DELETE
- DESC
- DESCRIRE
- DE
- GROUPE
- DANS
- INDEX
- INSERT
- INTERVALLE
- IS
- KEY
- LIKE
- LIMITE
- LONGUEUR
- MATCH
- PAS
- OPTION
- OU
- ORDRE
- PARTITION
- RANK
- RÉFÉRENCES
- SÉLECTIONNER
- TABLEAU
- À
- UPDATE
- OÙ
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 :
-
Il élimine la possibilité que vous ou un autre développeur utilisant votre base de données écrive accidentellement une erreur de syntaxe en raison de l'oubli - ou de l'ignorance - 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 pour vous-même ou pour les futurs développeurs.
-
Le mode de citation des identifiants diffère selon les dialectes SQL. Alors que MySQL utilise par défaut des backticks pour citer les identifiants, le SQL conforme à ANSI (et en fait MySQL en mode SQL ANSI, comme indiqué dans le paragraphe précédent) utilise les backticks pour citer les identifiants. aquí ) utilise des guillemets doubles pour citer les identifiants. Ainsi, les requêtes qui citent les identifiants avec des guillemets sont moins facilement transférables à d'autres dialectes SQL.
Dans le seul but de réduire le risque d'erreurs futures, il est généralement plus sage de procéder ainsi que de rétrociter l'identifiant.
2. Utiliser des backticks
S'il n'est pas possible de renommer la table ou la colonne, il suffit d'entourer l'identifiant en question de guillemets ( `
) comme décrit dans la citation précédente de 10.2 Noms des objets du schéma .
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)'
De même, la requête de la question peut être fixée en enveloppant le mot-clé key
en points de suspension, comme indiqué ci-dessous :
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^
13 votes
Si vous avez été redirigé ici mais que vous n'obtenez aucun message d'erreur, c'est probablement parce que vous n'avez pas effectué de vérification des erreurs. Cherchez des conseils sur la façon de le faire pour votre langue, votre bibliothèque et/ou votre outil - ne postez pas ici chaque fois que quelque chose ne fonctionne pas. Merci !
1 votes
Pourquoi seulement
MySQL
? Ce problème ne se pose-t-il pas dans toutes les technologies/langues ? Une telle référence/question/réponse canonique ne devrait-elle pas être applicable indépendamment d'une balise ? Aurons-nous une autre référence similaire AQ séparément pourSQLServer
parce que les backticks ne s'appliquent pas à cet endroit ; ou bienC
oC#
oVB
et nous pourrions nous retrouver avec une centaine de ces références AQ ?4 votes
@abhitalks : Parce que chaque implémentation a une saveur différente de SQL et ce qui s'applique à MySQL ne s'applique pas nécessairement à d'autres saveurs. Une question de référence pourrait apparaître si la communauté concernée en ressent le besoin. sinon je ne m'en préoccuperais pas. Et avoir une douzaine de questions de référence vaut mieux que d'avoir des milliers de questions dupliquées IMO.
0 votes
J'ai appliqué le verrouillage wiki ici parce qu'il commençait à accumuler beaucoup de réponses qui n'apportent rien.