Błąd składni spowodowany użyciem słowa zastrzeżonego jako nazwy tabeli lub kolumny w MySQL

May 03 2014

Próbuję wykonać proste zapytanie MySQL, jak poniżej:

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

Ale pojawia się następujący błąd:

BŁĄD 1064 (42000): Wystąpił błąd w składni SQL; Sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby uzyskać właściwą składnię, której należy użyć w pobliżu 'key) VALUES ('Tim', 'Florida', 42)'wiersza 1

Jak mogę rozwiązać ten problem?

Odpowiedzi

294 AmalMurali May 03 2014 at 22:29

#Problem

W MySQL, jak pewne słowa SELECT, INSERT, DELETEitd. Są zarezerwowane słowa. Ponieważ mają one specjalne znaczenie, MySQL traktuje to jako błąd składni za każdym razem, gdy używasz ich jako nazwy tabeli, nazwy kolumny lub innego rodzaju identyfikatora - chyba że otoczysz identyfikator grawitacjami.

Jak zauważono w oficjalnej dokumentacji, w sekcji 10.2 Nazwy obiektów schematu (wyróżnienie dodane):

Niektóre obiekty w MySQL, w tym baza danych, tabela, indeks, kolumna, alias, widok, procedura składowana, partycja, obszar tabel i inne nazwy obiektów są znane jako identyfikatory .

...

Jeśli identyfikator zawiera znaki specjalne lub jest słowem zastrzeżonym , należy go cytować za każdym razem, gdy się do niego odwołuje.

...

Znakiem cudzysłowu identyfikatora jest lewy przycisk („ `”):

Pełna lista słów kluczowych i słów zastrzeżonych znajduje się w rozdziale 10.3 Słowa kluczowe i słowa zastrzeżone . Na tej stronie słowa, po których następuje „(R)”, są słowami zastrzeżonymi. Poniżej wymieniono niektóre zastrzeżone słowa, w tym wiele, które powodują ten problem.

  • DODAJ
  • I
  • PRZED
  • PRZEZ
  • POŁĄCZENIE
  • WALIZKA
  • STAN: SCHORZENIE
  • USUNĄĆ
  • DESC
  • OPISAĆ
  • Z
  • GRUPA
  • W
  • INDEKS
  • WSTAWIĆ
  • INTERWAŁ
  • JEST
  • KLUCZ
  • LUBIĆ
  • LIMIT
  • DŁUGIE
  • MECZ
  • NIE
  • OPCJA
  • LUB
  • ZAMÓWIENIE
  • PRZEGRODA
  • BIBLIOGRAFIA
  • WYBIERZ
  • STÓŁ
  • DO
  • AKTUALIZACJA
  • GDZIE

#Rozwiązanie

Masz dwie możliwości.

1. Nie używaj zastrzeżonych słów jako identyfikatorów

Najprostszym rozwiązaniem jest po prostu unikanie używania słów zastrzeżonych jako identyfikatorów. Prawdopodobnie możesz znaleźć inną rozsądną nazwę dla swojej kolumny, która nie jest słowem zastrzeżonym.

Ma to kilka zalet:

  • Eliminuje to możliwość, że Ty lub inny programista korzystający z Twojej bazy danych przypadkowo napiszesz błąd składniowy z powodu zapomnienia - lub nieświadomości - że określony identyfikator jest słowem zastrzeżonym. W MySQL jest wiele słów zastrzeżonych i większość programistów raczej nie zna ich wszystkich. Nie używając tych słów w pierwszej kolejności, unikasz zostawiania pułapek dla siebie lub przyszłych programistów.

  • Sposób cytowania identyfikatorów różni się w poszczególnych dialektach SQL. Podczas gdy MySQL domyślnie używa cudzysłowów do cytowania identyfikatorów, SQL zgodny z ANSI (a także MySQL w trybie ANSI SQL, jak wspomniano tutaj ) używa podwójnych cudzysłowów do cytowania identyfikatorów. W związku z tym zapytania, które cytują identyfikatory za pomocą grawitacji, są trudniejsze do przeniesienia na inne dialekty SQL.

Wyłącznie w celu zmniejszenia ryzyka przyszłych błędów jest to zwykle mądrzejsze postępowanie niż cudzysłów identyfikatora.

2. Używaj grawisów

Jeśli zmiana nazwy tabeli lub kolumny nie jest możliwa, zawiń nieprawidłowy identyfikator w odwrotne apostrofy ( `), jak opisano we wcześniejszym cytacie z 10.2 Nazwy obiektów schematu .

Przykład do zademonstrowania użycia (zaczerpnięty z 10.3 Słowa kluczowe i słowa zastrzeżone ):

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)

Podobnie, zapytanie z pytania można naprawić, umieszczając słowo kluczowe keyw grawerach, jak pokazano poniżej:

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