El problema
En MySQL, ciertas palabras como SELECT
, INSERT
, DELETE
etc. son palabras reservadas. Dado que tienen un significado especial, MySQL lo trata como un error de sintaxis cada vez que los usa como nombre de tabla, nombre de columna u otro tipo de identificador, a menos que rodee el identificador con acentos graves.
Como se indica en los documentos oficiales, en la sección 10.2 Nombres de objetos de esquema (énfasis añadido):
Ciertos objetos dentro de MySQL, incluidos nombres de bases de datos, tablas, índices, columnas, alias, vistas, procedimientos almacenados, particiones, espacios de tablas y otros objetos, se conocen como identificadores. .
...
Si un identificador contiene caracteres especiales o es una palabra reservada , usted debe cítelo cada vez que se refiera a él.
...
El carácter de comillas del identificador es el comilla invertida ("`
"):
Puede encontrar una lista completa de palabras clave y palabras reservadas en la sección 10.3 Palabras clave y Palabras reservadas . En esa página, las palabras seguidas de "(R)" son palabras reservadas. Algunas palabras reservadas se enumeran a continuación, incluidas muchas que tienden a causar este problema.
- AÑADIR
- Y
- ANTES
- POR
- LLAMAR
- CASO
- CONDICIÓN
- ELIMINAR
- DESC
- DESCRIBA
- DESDE
- GRUPO
- EN
- ÍNDICE
- INSERTAR
- INTERVALO
- ES
- CLAVE
- ME GUSTA
- LÍMITE
- LARGO
- PARTIDO
- NO
- OPCIÓN
- O
- ORDEN
- PARTICIÓN
- RANGO
- REFERENCIAS
- SELECCIONAR
- TABLA
- A
- ACTUALIZAR
- DONDE
La solución
Tienes dos opciones.
1. No use palabras reservadas como identificadores
La solución más simple es simplemente evitar el uso de palabras reservadas como identificadores. Probablemente pueda encontrar otro nombre razonable para su columna que no sea una palabra reservada.
Hacer esto tiene un par de ventajas:
-
Elimina la posibilidad de que usted u otro desarrollador que use su base de datos escriba accidentalmente un error de sintaxis debido a que olvidó, o no supo, que un identificador en particular es una palabra reservada. Hay muchas palabras reservadas en MySQL y es poco probable que la mayoría de los desarrolladores las conozcan todas. Al no usar estas palabras en primer lugar, evita dejar trampas para usted o para futuros desarrolladores.
-
Los medios para citar identificadores difieren entre los dialectos de SQL. Mientras que MySQL usa acentos graves para citar identificadores de forma predeterminada, SQL compatible con ANSI (y de hecho MySQL en modo ANSI SQL, como se indica aquí ) usa comillas dobles para citar identificadores. Como tal, las consultas que citan identificadores con acentos graves son menos fáciles de trasladar a otros dialectos de SQL.
Por el simple hecho de reducir el riesgo de errores futuros, este suele ser un curso de acción más inteligente que citar el identificador con un acento grave.
2. Usar acentos graves
Si no es posible cambiar el nombre de la tabla o columna, envuelva el identificador ofensivo en acentos graves (`
) como se describe en la cita anterior de 10.2 Nombres de objetos de esquema
.
Un ejemplo para demostrar el uso (tomado de 10.3 Palabras clave y palabras reservadas ):
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)
Del mismo modo, la consulta de la pregunta se puede corregir envolviendo la palabra clave key
en acentos graves, como se muestra a continuación:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^