¿Cómo escapo las palabras reservadas utilizadas como nombres de columna? MySQL / Crear tabla

139

Estoy generando tablas a partir de clases en .NET y un problema es que una clase puede tener un nombre de campo keyque es una palabra clave reservada de MySQL. ¿Cómo escapo en una declaración de creación de tabla? (Nota: El otro problema a continuación es que el texto debe ser de un tamaño fijo para ser indexado / único)

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
key TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;
Jonathan Leffler
fuente

Respuestas:

184

Puede usar comillas dobles si el modo ANSI SQL está habilitado

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     "key" TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

o la marca de retorno patentada que se escapa de lo contrario. (En esta respuesta` se cubre dónde encontrar el carácter en varios diseños de teclado )

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     `key` TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

(Fuente: Manual de referencia de MySQL, 9.3 palabras reservadas )

Martin Smith
fuente
55
En mi humilde opinión, debe citar todos los nombres de campo y de tabla siempre.
rjmunro
10
@rjmunro: hacerlo es algo más defensivo ya que lo protege contra las nuevas palabras clave reservadas que se introducen en versiones posteriores, pero no me gusta el desorden visual.
Martin Smith
La misma solución (comillas dobles para escapar) también funciona para las palabras clave en el CQL de Cassandra. Un poco fuera de tema, lo sé, pero este hilo surgió en una búsqueda específica de Cassandra.
Godfrey Duke
El enlace del Manual de referencia de MySQL está roto por ahora. Enlace real: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64
71

Debe usar el carácter de retroceso (`), por ejemplo:

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
`key` TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;

fuente
15

Si está interesado en la portabilidad entre diferentes servidores SQL, debe usar consultas ANSI SQL. El escape de cadenas en ANSI SQL se realiza mediante comillas dobles ("). Desafortunadamente, este método de escape no es portátil para MySQL, a menos que esté configurado en modo de compatibilidad ANSI.

Personalmente, siempre inicio mi servidor MySQL con el argumento --sql-mode = 'ANSI' ya que esto permite ambos métodos para escapar. Si está escribiendo consultas que se ejecutarán en un servidor MySQL que no fue configurado / está controlado por usted, esto es lo que puede hacer:

  • Escriba todas sus consultas SQL en ANSI SQL
  • Adjúntelos en las siguientes consultas específicas de MySQL:

    SET @OLD_SQL_MODE=@@SQL_MODE;
    SET SESSION SQL_MODE='ANSI';
    -- ANSI SQL queries
    SET SESSION SQL_MODE=@OLD_SQL_MODE;

De esta manera, las únicas consultas específicas de MySQL están al principio y al final de su script .sql. Si desea enviarlos a un servidor diferente, simplemente elimine estas 3 consultas y estará listo. Aún más convenientemente podría crear un script llamado: script_mysql.sql que contendría las consultas de configuración de modo anteriores, generar un script script_ansi.sql y restablecer el modo.

Charalampos Serenis
fuente
¡Esto es genial! ¡Puedo escribir la consulta una vez y simplemente poner un interruptor para las pilas de MySQL!
Ravemir