Como escapar de palavras reservadas usadas como nomes de colunas? MySQL / Criar tabela

139

Estou gerando tabelas de classes no .NET e um problema é que uma classe pode ter um nome de campo keyque é uma palavra-chave reservada do MySQL. Como escapar dele em uma instrução create table? (Nota: O outro problema abaixo é o texto deve ter um tamanho fixo para ser indexado / exclusivo)

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
fonte

Respostas:

184

Você pode usar aspas duplas se o modo ANSI SQL estiver ativado

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; 

ou o back tick proprietário escapando de outra forma. (Onde encontrar o `caractere em vários layouts de teclado é abordado nesta resposta )

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; 

(Fonte: Manual de Referência do MySQL, 9.3 Palavras Reservadas )

Martin Smith
fonte
5
IMHO você deve citar todos os nomes de campos e nomes de tabelas sempre.
Rjmunro 17/09/2013
10
@rjmunro - Fazer isso é um pouco mais defensivo, pois protege você contra a introdução de novas palavras-chave reservadas em versões posteriores, mas não gosto da confusão visual.
Martin Smith
A mesma correção (aspas duplas para escapar) também funciona para palavras-chave no CQL de Cassandra. Um pouco fora de tópico, eu sei, mas esse tópico apareceu em uma pesquisa específica de Cassandra.
Godfrey Duke
O link do Manual de Referência do MySQL está quebrado por enquanto. Link real: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64
70

Você deve usar o caractere de retorno (`), por exemplo:

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;

fonte
15

Se você estiver interessado em portabilidade entre diferentes servidores SQL, use consultas ANSI SQL. O escape de string no ANSI SQL é feito usando aspas duplas ("). Infelizmente, esse método de escape não é portátil para o MySQL, a menos que esteja definido no modo de compatibilidade com ANSI.

Pessoalmente, eu sempre inicio meu servidor MySQL com o argumento --sql-mode = 'ANSI', pois isso permite os dois métodos de escape. Se você estiver escrevendo consultas que serão executadas em um servidor MySQL que não foi configurado / é controlado por você, eis o que você pode fazer:

  • Escreva todas as suas consultas SQL em SQL ANSI
  • Coloque-os nas seguintes consultas específicas do MySQL:

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

Dessa forma, as únicas consultas específicas do MySQL estão no início e no final do seu script .sql. Se você deseja enviá-los para um servidor diferente, remova essas 3 consultas e está tudo pronto. De forma ainda mais conveniente, você pode criar um script chamado: script_mysql.sql que contenha as consultas de configuração do modo acima, origine um script script_ansi.sql e redefina o modo.

Charalampos Serenis
fonte
Isso é ótimo! Eu posso escrever a consulta uma vez e basta colocar uma opção para pilhas do MySQL!
Ravemir 18/05