Errore di sintassi dovuto all'utilizzo di una parola riservata come nome di tabella o colonna in MySQL

May 03 2014

Sto cercando di eseguire una semplice query MySQL come di seguito:

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

Ma ricevo il seguente errore:

ERRORE 1064 (42000): hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino 'key) VALUES ('Tim', 'Florida', 42)'alla riga 1

Come posso risolvere il problema?

Risposte

294 AmalMurali May 03 2014 at 22:29

#Il problema

In MySQL, certe parole come SELECT, INSERT, DELETEecc, sono parole riservate. Poiché hanno un significato speciale, MySQL lo tratta come un errore di sintassi ogni volta che vengono utilizzati come nome di tabella, nome di colonna o altro tipo di identificatore, a meno che non si racchiuda l'identificatore con backtick.

Come indicato nei documenti ufficiali, nella sezione 10.2 Nomi degli oggetti dello schema (enfasi aggiunta):

Alcuni oggetti all'interno di MySQL, inclusi database, tabelle, indici, colonne, alias, viste, procedure memorizzate, partizioni, spazi tabelle e altri nomi di oggetti sono noti come identificatori .

...

Se un identificatore contiene caratteri speciali o è una parola riservata , è necessario citarla ogni volta che ci si riferisce.

...

Il carattere delle virgolette dell'identificatore è il backtick (" `"):

Un elenco completo di parole chiave e parole riservate è disponibile nella sezione 10.3 Parole chiave e parole riservate . In quella pagina, le parole seguite da "(R)" sono parole riservate. Di seguito sono elencate alcune parole riservate, comprese molte che tendono a causare questo problema.

  • INSERISCI
  • E
  • PRIMA
  • DI
  • CHIAMATA
  • ASTUCCIO
  • CONDIZIONE
  • ELIMINA
  • DESC
  • DESCRIVERE
  • A PARTIRE DAL
  • GRUPPO
  • NEL
  • INDICE
  • INSERIRE
  • INTERVALLO
  • È
  • CHIAVE
  • PIACE
  • LIMITE
  • LUNGO
  • INCONTRO
  • NON
  • OPZIONE
  • O
  • ORDINE
  • PARTIZIONE
  • RIFERIMENTI
  • SELEZIONARE
  • TAVOLO
  • PER
  • AGGIORNARE
  • DOVE

#La soluzione

Hai due opzioni.

1. Non utilizzare parole riservate come identificatori

La soluzione più semplice è semplicemente evitare di utilizzare parole riservate come identificatori. Probabilmente puoi trovare un altro nome ragionevole per la tua colonna che non sia una parola riservata.

Fare questo ha un paio di vantaggi:

  • Elimina la possibilità che tu o un altro sviluppatore che utilizza il tuo database scriviate accidentalmente un errore di sintassi dovuto al fatto che dimenticate - o non sapete - che un particolare identificatore è una parola riservata. Ci sono molte parole riservate in MySQL ed è improbabile che la maggior parte degli sviluppatori le conosca tutte. Non usando queste parole in primo luogo, eviti di lasciare trappole per te o per i futuri sviluppatori.

  • I mezzi per citare gli identificatori differiscono tra i dialetti SQL. Mentre MySQL utilizza i backtick per citare gli identificatori per impostazione predefinita, SQL conforme ad ANSI (e in effetti MySQL in modalità ANSI SQL, come indicato qui ) utilizza le virgolette doppie per citare gli identificatori. In quanto tali, le query che citano identificatori con backtick sono meno facilmente trasferibili ad altri dialetti SQL.

Al solo scopo di ridurre il rischio di errori futuri, questa è di solito una linea di condotta più saggia rispetto alla citazione all'indietro dell'identificatore.

2. Usa i backtick

Se non è possibile rinominare la tabella o la colonna, racchiudi l'identificatore incriminato tra i backtick ( `) come descritto nella citazione precedente da 10.2 Nomi degli oggetti dello schema .

Un esempio per dimostrare l'utilizzo (tratto da 10.3 Parole chiave e parole riservate ):

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)

Allo stesso modo, la query della domanda può essere risolta avvolgendo la parola chiave keyin backtick, come mostrato di seguito:

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