Problém
V MySQL určitá slova jako SELECT
, INSERT
, DELETE
atd. jsou vyhrazená slova. Vzhledem k tomu, že mají zvláštní význam, MySQL je považuje za chybu syntaxe, kdykoli je použijete jako název tabulky, název sloupce nebo jiný druh identifikátoru – pokud identifikátor neohraničíte zaškrtnutím.
Jak je uvedeno v oficiálních dokumentech, v sekci 10.2 Názvy objektů schématu (zvýraznění přidáno):
Některé objekty v MySQL, včetně databáze, tabulky, indexu, sloupce, aliasu, pohledu, uložené procedury, oddílu, tabulkového prostoru a dalších názvů objektů, jsou známé jako identifikátory .
...
Pokud identifikátor obsahuje speciální znaky nebo je rezervovaným slovem , musíte citujte jej, kdykoli na něj odkazujete.
...
Znak uvozovky identifikátoru je backtick („
`
"):
Úplný seznam klíčových slov a vyhrazených slov naleznete v sekci 10.3 Klíčová slova a Vyhrazená slova . Na této stránce jsou slova následovaná „(R)“ vyhrazená slova. Některá vyhrazená slova jsou uvedena níže, včetně mnoha, která tento problém obvykle způsobují.
- PŘIDAT
- A
- PŘED
- OD
- ZAVOLEJTE
- PŘÍPAD
- STAV
- SMAZAT
- DESC
- POPIŠTE
- OD
- GROUP
- IN
- INDEX
- VLOŽIT
- INTERVAL
- JE
- KLÍČ
- LIKE
- LIMIT
- DLOUHÉ
- SHODA
- NE
- MOŽNOST
- NEBO
- OBJEDNÁVKA
- ODDĚLENÍ
- HODNOCENÍ
- ODKAZY
- VYBRAT
- TABULKA
- DO
- AKTUALIZOVAT
- KDE
Řešení
Máte dvě možnosti.
1. Nepoužívejte vyhrazená slova jako identifikátor
Nejjednodušším řešením je jednoduše se vyhnout používání vyhrazených slov jako identifikátorů. Pravděpodobně můžete najít jiný rozumný název pro svůj sloupec, který není vyhrazeným slovem.
Má to několik výhod:
-
Eliminuje to možnost, že vy nebo jiný vývojář používající vaši databázi omylem zapíšete chybu syntaxe kvůli zapomenutí – nebo neznalosti –, že určitý identifikátor je vyhrazené slovo. V MySQL je mnoho vyhrazených slov a většina vývojářů je pravděpodobně nezná všechna. Nepoužíváte-li tato slova na prvním místě, vyhnete se zanechání pastí pro sebe nebo budoucí vývojáře.
-
Způsoby citování identifikátorů se mezi dialekty SQL liší. Zatímco MySQL ve výchozím nastavení používá pro citování identifikátorů backticks, SQL vyhovující ANSI (a skutečně MySQL v režimu ANSI SQL, jak je uvedeno zde ) používá pro citování identifikátorů dvojité uvozovky. Dotazy, které uvádějí identifikátory se zpětným zaškrtnutím, jsou proto hůře přenositelné do jiných dialektů SQL.
Čistě z důvodu snížení rizika budoucích chyb je to obvykle moudřejší postup než zpětné uvozování identifikátoru.
2. Použijte zpětné zatržení
Pokud přejmenování tabulky nebo sloupce není možné, zabalte problematický identifikátor do zpětných znamének (`
), jak je popsáno v dřívější citaci z 10.2 Názvy objektů schématu
.
Příklad pro demonstraci použití (převzato z 10.3 Keywords and Reserved Words ):
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)
Podobně lze dotaz z otázky opravit zabalením klíčového slova key
v backticks, jak je uvedeno níže:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^