O problema
No MySQL, certas palavras como
SELECT
, INSERT
, DELETE
etc. são palavras reservadas. Como eles têm um significado especial, o MySQL o trata como um erro de sintaxe sempre que você os usa como um nome de tabela, nome de coluna ou outro tipo de identificador - a menos que você coloque o identificador com acentos graves. Conforme observado nos documentos oficiais, na seção 10.2 Nomes de objetos de esquema (enfase adicionada):
Certos objetos dentro do MySQL, incluindo banco de dados, tabela, índice, coluna, alias, exibição, procedimento armazenado, partição, tablespace e outros nomes de objetos são conhecidos como identificadores .
...
Se um identificador contiver caracteres especiais ou for uma palavra reservada , você deve citá-lo sempre que você se referir a ele.
...
O caractere de aspas identificador é o acento grave ("`
"):
Uma lista completa de palavras-chave e palavras reservadas pode ser encontrada na seção 10.3 Palavras-chave e Palavras reservadas . Nessa página, as palavras seguidas de "(R)" são palavras reservadas. Algumas palavras reservadas estão listadas abaixo, incluindo muitas que tendem a causar esse problema.
- ADICIONAR
- E
- ANTES
- DE
- LIGAR
- CASO
- CONDIÇÃO
- EXCLUIR
- DESC
- DESCREVER
- DE
- GRUPO
- EM
- ÍNDICE
- INSERIR
- INTERVALO
- É
- CHAVE
- Gostei
- LIMITE
- LONGO
- COMBINAR
- NÃO
- OPÇÃO
- OU
- PEDIDO
- PARTIÇÃO
- CLASSIFICAÇÃO
- REFERÊNCIAS
- SELECIONAR
- TABELA
- PARA
- ATUALIZAÇÃO
- ONDE
A solução
Você tem duas opções.
1. Não use palavras reservadas como identificadores
A solução mais simples é simplesmente evitar o uso de palavras reservadas como identificadores. Você provavelmente pode encontrar outro nome razoável para sua coluna que não seja uma palavra reservada.
Fazer isso tem algumas vantagens:
-
Ele elimina a possibilidade de que você ou outro desenvolvedor usando seu banco de dados acidentalmente escreva um erro de sintaxe por esquecer - ou não saber - que um identificador específico é uma palavra reservada. Existem muitas palavras reservadas no MySQL e é improvável que a maioria dos desenvolvedores conheça todas elas. Ao não usar essas palavras em primeiro lugar, você evita deixar armadilhas para você ou para futuros desenvolvedores.
-
Os meios de citar identificadores diferem entre os dialetos SQL. Enquanto o MySQL usa backticks para citar identificadores por padrão, SQL compatível com ANSI (e de fato MySQL no modo ANSI SQL, conforme observado aqui ) usa aspas duplas para citar identificadores. Como tal, as consultas que citam identificadores com acentos graves são menos facilmente transportáveis para outros dialetos SQL.
Puramente para reduzir o risco de erros futuros, esse geralmente é um curso de ação mais sábio do que citar o identificador com backtick.
2. Use acentos graves
Se não for possível renomear a tabela ou coluna, coloque o identificador incorreto em acentos graves (
`
) conforme descrito na citação anterior de 10.2 Schema Object Names
. Um exemplo para demonstrar o uso (retirado de 10.3 Palavras-chave e palavras 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)
Da mesma forma, a consulta da pergunta pode ser corrigida envolvendo a palavra-chave
key
em backticks, como mostrado abaixo:INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^