Mysql
 sql >> Database >  >> RDS >> Mysql

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

Il problema

In MySQL, alcune parole come SELECT , INSERT , DELETE ecc. sono parole riservate. Dal momento che hanno un significato speciale, MySQL lo tratta come un errore di sintassi ogni volta che li usi come nome di tabella, nome di colonna o altro tipo di identificatore, a meno che non circondi 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, stored procedure, partizioni, tablespace e altri nomi di oggetti sono noti come identificatori .

...

Se un identificatore contiene caratteri speciali o è una parola riservata , devi citalo ogni volta che ti riferisci ad esso.

...

Il carattere della virgoletta identificativa è 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, tra cui molte che tendono a causare questo problema.

  • AGGIUNGI
  • E
  • PRIMA
  • DA
  • CHIAMA
  • CASO
  • CONDIZIONE
  • ELIMINA
  • DESC
  • DESCRIVERE
  • DA
  • GRUPPO
  • IN
  • INDICE
  • INSERIRE
  • INTERVALLO
  • È
  • CHIAVE
  • MI PIACE
  • LIMITE
  • LUNGO
  • PARTITA
  • NON
  • OPZIONE
  • O
  • ORDINA
  • PARTIZIONE
  • GRADO
  • RIFERIMENTI
  • SELEZIONA
  • TABELLA
  • A
  • AGGIORNAMENTO
  • 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.

Questo ha un paio di vantaggi:

  • Elimina la possibilità che tu o un altro sviluppatore che utilizza il tuo database scriva accidentalmente un errore di sintassi dovuto alla dimenticanza o alla mancata conoscenza 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 stesso o per i futuri sviluppatori.

  • I mezzi per citare gli identificatori differiscono tra i dialetti SQL. Sebbene MySQL utilizzi 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. Pertanto, 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 è solitamente una linea d'azione più saggia rispetto a virgolettere l'identificatore.

2. Usa i backtick

Se non è possibile rinominare la tabella o la colonna, racchiudere l'identificatore offensivo nei 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 dalla domanda può essere corretta racchiudendo la parola chiave key nei backtick, come mostrato di seguito:

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