Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Erro de sintaxe devido ao uso de uma palavra reservada como nome de tabela ou coluna no MySQL

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)";               ^   ^