Проблемът
В MySQL определени думи като SELECT
, INSERT
, DELETE
и т.н. са запазени думи. Тъй като те имат специално значение, MySQL го третира като синтактична грешка всеки път, когато ги използвате като име на таблица, име на колона или друг вид идентификатор - освен ако не заобиколите идентификатора с обратни отметки.
Както е отбелязано в официалните документи, в раздел 10.2 Имена на обекти на схема (ударението е добавено):
Определени обекти в MySQL, включително база данни, таблица, индекс, колона, псевдоним, изглед, съхранена процедура, дял, пространство за таблици и други имена на обекти, са известни като идентификатори .
...
Ако идентификаторът съдържа специални знаци или е резервирана дума , вие трябва цитирайте го винаги, когато се позовавате на него.
...
Идентификаторът за кавички е отметката („
`
"):
Пълен списък с ключови думи и запазени думи можете да намерите в раздел 10.3 Ключови думи и Запазени думи . На тази страница думите, последвани от "(R)", са запазени думи. Някои запазени думи са изброени по-долу, включително много, които са склонни да причинят този проблем.
- ДОБАВЯНЕ
- И
- ПРЕДИ
- ОТ
- ОБАДИ се
- СЛУЧАЙ
- СЪСТОЯНИЕ
- ИЗТРИВАНЕ
- DESC
- ОПИСАЙТЕ
- ОТ
- ГРУПА
- В
- ИНДЕКС
- ВМЪКНЕТЕ
- ИНТЕРВАЛ
- И
- КЛЮЧ
- Харесвам
- LIMIT
- ДЪЛГО
- МАЧИ
- НЕ
- ОПЦИЯ
- ИЛИ
- ПОРЪЧАЙТЕ
- ДЯЛ
- РАНГ
- РЕФЕРЕНЦИИ
- ИЗБЕРЕТЕ
- ТАБЛИЦА
- ДО
- АКТУАЛИЗИРАНЕ
- КЪДЕ
Решението
Имате две опции.
1. Не използвайте запазени думи като идентификатори
Най-простото решение е просто да избягвате използването на запазени думи като идентификатори. Вероятно можете да намерите друго разумно име за колоната си, което не е запазена дума.
Това има няколко предимства:
-
Това елиминира възможността вие или друг разработчик, използващ вашата база данни, случайно да напишете синтактична грешка поради забравяне или незнание, че даден идентификатор е запазена дума. В MySQL има много запазени думи и е малко вероятно повечето разработчици да знаят всички от тях. Като не използвате тези думи на първо място, вие избягвате да оставяте капани за себе си или бъдещите разработчици.
-
Средствата за цитиране на идентификатори се различават между SQL диалектите. Докато MySQL използва backtick за цитиране на идентификатори по подразбиране, ANSI-съвместим SQL (и наистина MySQL в ANSI SQL режим, както е отбелязано тук ) използва двойни кавички за цитиране на идентификатори. Като такива, заявките, които цитират идентификатори с обратни отметки, са по-малко лесно преносими към други SQL диалекти.
Само с цел намаляване на риска от бъдещи грешки, това обикновено е по-мъдър начин на действие, отколкото цитиране на идентификатора.
2. Използвайте отметки
Ако преименуването на таблицата или колоната не е възможно, увийте идентификатора в нарушение в обратни тикчета (`
) както е описано в по-ранния цитат от 10.2 Имена на обекти на схема
.
Пример за демонстриране на употребата (взет от 10.3 Ключови думи и запазени думи ):
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)
По същия начин, заявката от въпроса може да бъде коригирана чрез обвиване на ключовата дума key
в обратни отметки, както е показано по-долу:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^