Mysql
 sql >> Baza danych >  >> RDS >> Mysql

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

Problem

W MySQL niektóre słowa, takie jak SELECT , INSERT , DELETE itp. są słowami zastrzeżonymi. Ponieważ mają one specjalne znaczenie, MySQL traktuje je 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 znakami wstecznymi.

Jak wspomniano w oficjalnych dokumentach, w sekcji 10.2 Nazwy obiektów schematu (podkreślenie dodane):

Niektóre obiekty w MySQL, w tym bazy 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 zarezerwowanym , musisz cytuj go za każdym razem, gdy się do niego odwołujesz.

...

Znak cudzysłowu identyfikatora to wstecz ("` "):

Pełną listę słów kluczowych i słów zastrzeżonych można znaleźć w sekcji 10.3 Słowa kluczowe i Zarezerwowane słowa . Na tej stronie słowa, po których następuje „(R)” są słowami zastrzeżonymi. Niektóre zastrzeżone słowa są wymienione poniżej, w tym wiele, które powodują ten problem.

  • DODAJ
  • ORAZ
  • PRZED
  • Przez
  • ZADZWOŃ
  • Walizka
  • STAN
  • USUŃ
  • DESC
  • OPISZ
  • OD
  • GRUPA
  • W
  • INDEKS
  • WSTAW
  • PRZERWA
  • Jest
  • KLUCZ
  • LUBIĘ
  • LIMIT
  • DŁUGI
  • DOPASUJ
  • NIE
  • OPCJA
  • LUB
  • ZAMÓW
  • PARTYCJA
  • RANGA
  • REFERENCJE
  • WYBIERZ
  • TABELA
  • Do
  • AKTUALIZUJ
  • GDZIE

Rozwiązanie

Masz dwie opcje.

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 możliwość, że Ty lub inny programista korzystający z Twojej bazy danych przypadkowo zapisze błąd składni z powodu zapomnienia – lub niewiedzy – że określony identyfikator jest słowem zastrzeżonym. W MySQL jest wiele zastrzeżonych słów i większość programistów raczej nie zna ich wszystkich. Nie używając tych słów w pierwszej kolejności, unikasz pozostawiania pułapek na 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 backticków do cytowania identyfikatorów, SQL zgodny z ANSI (i rzeczywiście MySQL w trybie ANSI SQL, jak zauważono tu ) używa podwójnych cudzysłowów do cytowania identyfikatorów. W związku z tym zapytania, które cytują identyfikatory z backtickami, są trudniejsze do przeniesienia do innych dialektów SQL.

Wyłącznie w celu zmniejszenia ryzyka przyszłych błędów, jest to zwykle mądrzejszy sposób postępowania niż cofanie się i cytowanie identyfikatora.

2. Użyj backticków

Jeśli zmiana nazwy tabeli lub kolumny nie jest możliwa, owiń naruszający identyfikator znacznikami (` ) jak opisano we wcześniejszym cytacie z 10.2 Nazwy obiektów schematu .

Przykład demonstrujący użycie (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 key w backtickach, jak pokazano poniżej:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dynamicznie ładuj dane na div scroll za pomocą php, mysql, jquery i ajax

  2. Pierwsze kroki z GearHost do tworzenia baz danych MySQL

  3. Co robi DELIMITER // w wyzwalaczu?

  4. Alternatywa MySQL dla T-SQL'a WITH TIES

  5. Jak mogę połączyć się z MySQL w Pythonie 3 w systemie Windows?