Problemet
I MySQL, vissa ord som SELECT
, INSERT
, DELETE
etc. är reserverade ord. Eftersom de har en speciell betydelse, behandlar MySQL det som ett syntaxfel när du använder dem som ett tabellnamn, kolumnnamn eller annan typ av identifierare - såvida du inte omger identifieraren med backticks.
Som noterats i de officiella dokumenten, i avsnittet 10.2 Schemaobjektnamn (min kursivering):
Vissa objekt inom MySQL, inklusive databas, tabell, index, kolumn, alias, vy, lagrad procedur, partition, tabellutrymme och andra objektnamn är kända som identifierare .
...
Om en identifierare innehåller specialtecken eller är ett reserverat ord , du måste citera det när du refererar till det.
...
Identifierarens citattecken är backtick ("
`
"):
En komplett lista med sökord och reserverade ord finns i avsnittet 10.3 Nyckelord och Reserverade ord . På den sidan är ord följt av "(R)" reserverade ord. Några reserverade ord listas nedan, inklusive många som tenderar att orsaka detta problem.
- LÄGG TILL
- OCH
- INNAN
- AV
- RING
- FALL
- VILLKOR
- RADERA
- DESC
- BESKRIV
- FRÅN
- GRUPP
- IN
- INDEX
- INSERT
- INTERVALL
- IS
- NYCKEL
- GILLA
- LIMIT
- LÅNG
- MATCH
- INTE
- ALTERNATIV
- ELLER
- BESTÄLL
- PARTITION
- RANK
- REFERENSER
- VÄLJ
- TABELL
- TILL
- UPPDATERA
- VAR
Lösningen
Du har två alternativ.
1. Använd inte reserverade ord som identifierare
Den enklaste lösningen är helt enkelt att undvika att använda reserverade ord som identifierare. Du kan förmodligen hitta ett annat rimligt namn för din kolumn som inte är ett reserverat ord.
Att göra detta har ett par fördelar:
-
Det eliminerar möjligheten att du eller en annan utvecklare som använder din databas av misstag kommer att skriva ett syntaxfel på grund av att du glömmer - eller inte vet - att en viss identifierare är ett reserverat ord. Det finns många reserverade ord i MySQL och det är osannolikt att de flesta utvecklare känner till dem alla. Genom att inte använda dessa ord i första hand undviker du att lämna fällor för dig själv eller framtida utvecklare.
-
Metoden för att citera identifierare skiljer sig åt mellan SQL-dialekter. Medan MySQL använder backticks för att citera identifierare som standard, ANSI-kompatibel SQL (och faktiskt MySQL i ANSI SQL-läge, som nämnts här ) använder dubbla citattecken för att citera identifierare. Som sådana är frågor som citerar identifierare med backticks mindre lätta att överföra till andra SQL-dialekter.
Enbart för att minska risken för framtida misstag är detta vanligtvis ett klokare tillvägagångssätt än att backtick-citera identifieraren.
2. Använd backticks
Om det inte är möjligt att byta namn på tabellen eller kolumnen, linda in den stötande identifieraren med backticks (`
) som beskrivs i det tidigare citatet från 10.2 Schemaobjektnamn
.
Ett exempel för att demonstrera användningen (taget från 10.3 Nyckelord och reserverade ord ):
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)
På samma sätt kan frågan från frågan fixas genom att slå in nyckelordet key
i backticks, som visas nedan:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^