sql >> Database >  >> RDS >> Mysql

Syntaxisfout door het gebruik van een gereserveerd woord als tabel- of kolomnaam in MySQL

Het probleem

In MySQL kunnen bepaalde woorden zoals SELECT , INSERT , DELETE enz. zijn gereserveerde woorden. Omdat ze een speciale betekenis hebben, behandelt MySQL het als een syntaxisfout wanneer je ze gebruikt als tabelnaam, kolomnaam of ander soort identifier - tenzij je de identifier omringt met backticks.

Zoals vermeld in de officiële documenten, in sectie 10.2 Schema-objectnamen (nadruk toegevoegd):

Bepaalde objecten binnen MySQL, waaronder database, tabel, index, kolom, alias, weergave, opgeslagen procedure, partitie, tabelruimte en andere objectnamen staan ​​bekend als identifiers .

...

Als een identifier speciale tekens bevat of een gereserveerd woord . is , je moet citeer het telkens als je ernaar verwijst.

...

Het identifier-aanhalingsteken is de backtick ("` "):

Een volledige lijst van trefwoorden en gereserveerde woorden is te vinden in sectie 10.3 Trefwoorden en Gereserveerde woorden . Op die pagina zijn woorden gevolgd door "(R)" gereserveerde woorden. Hieronder worden enkele gereserveerde woorden vermeld, waaronder veel die dit probleem veroorzaken.

  • TOEVOEGEN
  • EN
  • VOOR
  • DOOR
  • BEL
  • CASE
  • CONDITIE
  • VERWIJDEREN
  • DESC
  • BESCHRIJVEN
  • VAN
  • GROEP
  • IN
  • INDEX
  • INSERT
  • INTERVAL
  • IS
  • SLEUTEL
  • LIKE
  • LIMIET
  • LANG
  • WEDSTRIJD
  • NIET
  • OPTIE
  • OF
  • BESTEL
  • PARTITIE
  • RANG
  • REFERENTIES
  • SELECTEER
  • TABEL
  • NAAR
  • UPDATE
  • WAAR

De oplossing

Je hebt twee opties.

1. Gebruik geen gereserveerde woorden als identifiers

De eenvoudigste oplossing is simpelweg om het gebruik van gereserveerde woorden als identifiers te vermijden. U kunt waarschijnlijk een andere redelijke naam voor uw kolom vinden die geen gereserveerd woord is.

Dit heeft een aantal voordelen:

  • Het elimineert de mogelijkheid dat u of een andere ontwikkelaar die uw database gebruikt, per ongeluk een syntaxisfout schrijft doordat u vergeet - of niet weet - dat een bepaalde identifier een gereserveerd woord is. Er zijn veel gereserveerde woorden in MySQL en de meeste ontwikkelaars zullen ze waarschijnlijk niet allemaal kennen. Door deze woorden in de eerste plaats niet te gebruiken, voorkom je dat je valstrikken voor jezelf of toekomstige ontwikkelaars achterlaat.

  • De manier waarop identifiers worden geciteerd, verschilt tussen SQL-dialecten. Hoewel MySQL standaard backticks gebruikt voor het citeren van identifiers, ANSI-compliant SQL (en inderdaad MySQL in ANSI SQL-modus, zoals opgemerkt hier ) gebruikt dubbele aanhalingstekens voor het aanhalen van identifiers. Als zodanig zijn zoekopdrachten die identifiers citeren met backticks minder gemakkelijk overdraagbaar naar andere SQL-dialecten.

Puur om het risico op toekomstige fouten te verkleinen, is dit meestal een verstandiger manier van handelen dan het citeren van de identifier.

2. Gebruik backticks

Als het hernoemen van de tabel of kolom niet mogelijk is, zet u de aanstootgevende identifier tussen backticks (` ) zoals beschreven in het eerdere citaat van 10.2 Schema-objectnamen .

Een voorbeeld om het gebruik te demonstreren (overgenomen uit 10.3 Trefwoorden en gereserveerde woorden ):

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)

Evenzo kan de zoekopdracht van de vraag worden opgelost door het trefwoord key . in te pakken in backticks, zoals hieronder weergegeven:

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



  1. Is er een SELECT ... INTO OUTFILE-equivalent in SQL Server Management Studio?

  2. INSERT a SELECT GROUP BY :meer doelkolommen dan expressies fout

  3. Ingenieus hulpprogramma voor het wijzigen van SQL-wachtwoorden om het SQL-wachtwoord opnieuw in te stellen

  4. Geo-zoeken (afstand) in PHP/MySQL (prestaties)