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

Syntaksfejl på grund af brug af et reserveret ord som et tabel- eller kolonnenavn i MySQL

Problemet

I MySQL er visse ord som SELECT , INSERT , DELETE osv. er reserverede ord. Da de har en særlig betydning, behandler MySQL det som en syntaksfejl, når du bruger dem som et tabelnavn, kolonnenavn eller anden form for identifikator - medmindre du omgiver identifikatoren med backticks.

Som nævnt i de officielle dokumenter, i afsnittet 10.2 Skemaobjektnavne (fremhævelse tilføjet):

Visse objekter i MySQL, herunder database, tabel, indeks, kolonne, alias, visning, lagret procedure, partition, tablespace og andre objektnavne er kendt som identifikatorer .

...

Hvis en identifikator indeholder specialtegn eller er et reserveret ord , du skal citer det, når du henviser til det.

...

Identifikations-citattegn er tilbagekrydset ("` "):

En komplet liste over søgeord og reserverede ord kan findes i afsnittet 10.3 Nøgleord og Reserverede ord . På den side er ord efterfulgt af "(R)" reserverede ord. Nogle reserverede ord er angivet nedenfor, inklusive mange, der har tendens til at forårsage dette problem.

  • TILFØJ
  • OG
  • FØR
  • AF
  • RING
  • CASE
  • TILSTAND
  • SLET
  • DESC
  • BESKRIV
  • FRA
  • GRUPPE
  • IN
  • INDEKS
  • INDSÆT
  • INTERVAL
  • IS
  • NØGLE
  • LIKE
  • LIMIT
  • LANG
  • MATCH
  • IKKE
  • MULIGHED
  • ELLER
  • BEstil
  • OPDELING
  • RANK
  • REFERENCER
  • VÆLG
  • TABEL
  • TIL
  • OPDATERING
  • HVOR

Løsningen

Du har to muligheder.

1. Brug ikke reserverede ord som identifikatorer

Den enkleste løsning er simpelthen at undgå at bruge reserverede ord som identifikatorer. Du kan sikkert finde et andet fornuftigt navn til din spalte, som ikke er et reserveret ord.

At gøre dette har et par fordele:

  • Det eliminerer muligheden for, at du eller en anden udvikler, der bruger din database, ved et uheld vil skrive en syntaksfejl på grund af at glemme - eller ikke vide - at en bestemt identifikator er et reserveret ord. Der er mange reserverede ord i MySQL, og det er usandsynligt, at de fleste udviklere kender dem alle. Ved ikke at bruge disse ord i første omgang undgår du at efterlade fælder til dig selv eller fremtidige udviklere.

  • Midlerne til at citere identifikatorer adskiller sig mellem SQL-dialekter. Mens MySQL som standard bruger backticks til at citere identifikatorer, ANSI-kompatibel SQL (og faktisk MySQL i ANSI SQL-tilstand, som nævnt her ) bruger dobbelte anførselstegn til at citere identifikatorer. Som sådan er forespørgsler, der citerer identifikatorer med backticks, mindre let at overføre til andre SQL-dialekter.

Udelukkende for at reducere risikoen for fremtidige fejl, er dette normalt en klogere fremgangsmåde end at citere identifikatoren tilbage.

2. Brug backticks

Hvis det ikke er muligt at omdøbe tabellen eller kolonnen, skal du ombryde den fornærmende identifikator i backticks (` ) som beskrevet i det tidligere citat fra 10.2 Skemaobjektnavne .

Et eksempel til at demonstrere brugen (taget fra 10.3 Søgeord og reserverede 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å samme måde kan forespørgslen fra spørgsmålet rettes ved at ombryde søgeordet key i backticks, som vist nedenfor:

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



  1. Hvordan Tan() virker i PostgreSQL

  2. Returner kun de numeriske værdier fra en PostgreSQL-databasekolonne

  3. Sådan rundes et tal op til det nærmeste heltal i SQL

  4. Fatal fejl:Kald til udefineret funktion sqlsrv_connect() i C:\xampp\htdocs