我正在嘗試執行一個簡單的 MySQL 查詢,如下所示:
INSERT INTO user_details (username, location, key) VALUES ('Tim', 'Florida', 42)
但我收到以下錯誤:
錯誤1064 (42000):您的SQL 語法有錯誤;檢查與您的MySQL 伺服器版本相對應的手冊,以了解在第1 行'key) VALUES ('Tim', 'Florida', 42 )' 附近使用的正確語法
'key) VALUES ('Tim', 'Florida', 42 )'
如何解決這個問題?
在MySQL中,某些字如SELECT、INSERT、DELETE等是保留字。由於它們具有特殊含義,因此每當您將它們用作表名、列名或其他類型的標識符時,MySQL 都會將其視為語法錯誤 - 除非您用反引號將標識符括起來。
SELECT
INSERT
DELETE
如同官方文件所述,在10.2 架構物件名稱 em>(強調):
關鍵字和保留字的完整清單可以在10.3關鍵字部分找到和保留字。在該頁面中,後面有「(R)」的單字是保留字。下面列出了一些保留字,其中包括許多容易導致此問題的保留字。
您有兩個選擇。
最簡單的解決方案就是避免使用保留字作為識別字。您也許可以為您的列找到另一個合理的名稱,該名稱不是保留字。
這樣做有幾個優點:
它消除了您或其他使用資料庫的開發人員由於忘記或不知道特定標識符是保留字而意外編寫語法錯誤的可能性。 MySQL 中有很多保留字,大多數開發人員不太可能知道所有這些保留字。透過先不使用這些字詞,您可以避免給自己或未來的開發人員留下陷阱。
SQL 方言之間引用標識符的方式有所不同。雖然 MySQL 預設使用反引號來引用標識符,但符合 ANSI 的 SQL(實際上是 ANSI SQL 模式下的 MySQL,如此處所述) ) 使用雙引號來引用標識符。因此,用反引號引用標識符的查詢不太容易移植到其他 SQL 方言。
純粹是為了降低未來發生錯誤的風險,這通常是比反引號引用識別碼更明智的做法。
如果無法重新命名表或列,請將有問題的識別符括在反引號(`#) 中,如前面引用的10.2 架構物件名稱 。
`
示範用法的範例(取自10.3 關鍵字和保留字 ):
同樣,問題中的查詢可以透過將關鍵字 key 用反引號括起來來修復,如下所示:
key
INSERT INTO user_details (username, location, `key`) VALUES ('Tim', 'Florida', 42)"; ^ ^
問題
在MySQL中,某些字如
SELECT
、INSERT
、DELETE
等是保留字。由於它們具有特殊含義,因此每當您將它們用作表名、列名或其他類型的標識符時,MySQL 都會將其視為語法錯誤 - 除非您用反引號將標識符括起來。如同官方文件所述,在10.2 架構物件名稱 em>(強調):
關鍵字和保留字的完整清單可以在10.3關鍵字部分找到和保留字。在該頁面中,後面有「(R)」的單字是保留字。下面列出了一些保留字,其中包括許多容易導致此問題的保留字。
解決方案
您有兩個選擇。
1。不要使用保留字作為標識符
最簡單的解決方案就是避免使用保留字作為識別字。您也許可以為您的列找到另一個合理的名稱,該名稱不是保留字。
這樣做有幾個優點:
它消除了您或其他使用資料庫的開發人員由於忘記或不知道特定標識符是保留字而意外編寫語法錯誤的可能性。 MySQL 中有很多保留字,大多數開發人員不太可能知道所有這些保留字。透過先不使用這些字詞,您可以避免給自己或未來的開發人員留下陷阱。
SQL 方言之間引用標識符的方式有所不同。雖然 MySQL 預設使用反引號來引用標識符,但符合 ANSI 的 SQL(實際上是 ANSI SQL 模式下的 MySQL,如此處所述) ) 使用雙引號來引用標識符。因此,用反引號引用標識符的查詢不太容易移植到其他 SQL 方言。
純粹是為了降低未來發生錯誤的風險,這通常是比反引號引用識別碼更明智的做法。
2。使用反引號
如果無法重新命名表或列,請將有問題的識別符括在反引號(
`
#) 中,如前面引用的10.2 架構物件名稱 。示範用法的範例(取自10.3 關鍵字和保留字 ):
同樣,問題中的查詢可以透過將關鍵字
key
用反引號括起來來修復,如下所示: