Error de sintaxis debido a la utilizaciĆ³n de una palabra reservada como nombre de tabla o columna en MySQL

mysql reserved-words


Estoy tratando de ejecutar una simple consulta de MySQL como la siguiente:

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

Pero estoy recibiendo 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 de 'key) VALUES ('Tim', 'Florida', 42)' en la línea 1

¿Cómo puedo arreglar el problema?




Answer 1 Amal Murali


El problema

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

Como se señaló 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 objetos se conocen como identificadores .

...

Si un identificador contiene caracteres especiales o es una palabra reservada , debe citarlo siempre que lo consulte.

...

El carácter de comilla del identificador es la tecla de retroceso (" ` "):

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.

  • ADD
  • AND
  • BEFORE
  • BY
  • CALL
  • CASE
  • CONDITION
  • DELETE
  • DESC
  • DESCRIBE
  • FROM
  • GROUP
  • IN
  • INDEX
  • INSERT
  • INTERVAL
  • IS
  • KEY
  • LIKE
  • LIMIT
  • LONG
  • MATCH
  • NOT
  • OPTION
  • OR
  • ORDER
  • PARTITION
  • REFERENCES
  • SELECT
  • TABLE
  • TO
  • UPDATE
  • WHERE

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 escriba accidentalmente un error de sintaxis debido a que olvide-o no sepa-que un identificador 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,usted evita dejar trampas para usted mismo o para futuros desarrolladores.

  • Los medios para citar identificadores difieren entre dialectos SQL. Si bien MySQL usa backticks 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 backticks son menos fáciles de transportar a otros dialectos SQL.

Sólo con el fin de reducir el riesgo de futuros errores,este suele ser un curso de acción más sabio que citar el identificador.

2.Usar palos de espalda

Si no es posible cambiar el nombre de la tabla o columna, ajuste el identificador ofensivo en comillas ( ` ) 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 solucionar al ajustar la clave de la palabra key en backticks, como se muestra a continuación:

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