Error de sintaxis debido al uso de una palabra reservada como nombre de tabla o columna en MySQL

May 03 2014

Estoy tratando de ejecutar una consulta MySQL simple como se muestra a continuación:

INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)

Pero recibo el siguiente error:

ERROR 1064 (42000): Tiene un error en su sintaxis SQL; Consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca 'key) VALUES ('Tim', 'Florida', 42)'de la línea 1

¿Cómo puedo solucionar el problema?

Respuestas

294 AmalMurali May 03 2014 at 22:29

#El problema

En MySQL, ciertas palabras como SELECT, INSERT, DELETEetc. 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 comillas invertidas.

Como se indica en los documentos oficiales, en la sección 10.2 Nombres de objetos de esquema (énfasis agregado):

Ciertos objetos dentro de MySQL, incluida la base de datos, tabla, índice, columna, alias, vista, procedimiento almacenado, partición, espacio de tabla y otros nombres de objeto, se conocen como identificadores .

...

Si un identificador contiene caracteres especiales o es una palabra reservada , debe citarlo siempre que se refiera a él.

...

El carácter de la cita del identificador es el signo inverso (" `"):

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 DE
  • POR
  • LLAMADA
  • CASO
  • CONDICIÓN
  • ELIMINAR
  • DESC
  • DESCRIBIR
  • DESDE
  • GRUPO
  • EN
  • ÍNDICE
  • INSERTAR
  • INTERVALO
  • ES
  • LLAVE
  • ME GUSTA
  • LÍMITE
  • LARGO
  • PARTIDO
  • NO
  • OPCIÓN
  • O
  • ORDEN
  • DIVIDIR
  • REFERENCIAS
  • SELECCIONE
  • MESA
  • A
  • ACTUALIZAR
  • DÓNDE

#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 utilice su base de datos escriban accidentalmente un error de sintaxis debido a que se olvidan, o no saben, 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 los futuros desarrolladores.

  • Los medios de citar identificadores difieren entre los dialectos SQL. Mientras que MySQL usa comillas inversas 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 comillas invertidas son menos fáciles de transportar a otros dialectos SQL.

Por el mero hecho de reducir el riesgo de errores futuros, este suele ser un curso de acción más inteligente que citar el identificador con comillas invertidas.

2. Usa comillas invertidas

Si no es posible cambiar el nombre de la tabla o columna, envuelva el identificador ofensivo `entre comillas invertidas ( ) 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)

De manera similar, la consulta de la pregunta se puede arreglar envolviendo la palabra clave keyentre comillas inversas, como se muestra a continuación:

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