MySQL語法錯誤:使用保留字作為表名或列名所造成的問題
P粉937769356
P粉937769356 2023-08-21 20:17:23
0
1
346

我正在嘗試執行以下簡單的MySQL查詢:

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

但我得到了以下錯誤:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near <code to >'); Florida', 42)' at line 1

我該如何解決這個問題?

P粉937769356
P粉937769356

全部回覆 (1)
P粉541796322

問題

在MySQL中,某些字如SELECTINSERTDELETE等是保留字。由於它們具有特殊含義,當您將它們用作表名、列名或其他類型的標識符時,MySQL會將其視為語法錯誤 - 除非您用反引號將標識符括起來。

正如官方文件中所指出的,在第10.2 模式物件名稱節中(強調添加):

關鍵字和保留字的完整清單可以在第10.3 關鍵字和保留字節中找到。在該頁面中,帶有「(R)」的單字是保留字。下面列出了一些保留字,其中包括許多可能引起此問題的單字。

  • ADD
  • AND
  • BEFORE
  • #BY
  • CALL
  • CASE
  • CONDITION
  • DELETE
  • DESC
  • DESCRIBE
  • FROM
  • GROUP
  • IN
  • INDEX
  • INSERT
  • INTERVAL
  • IS
  • KEY
  • LIKE
  • LIMIT
  • LONG
  • MATCH
  • NOT
  • OPTION
  • OR
  • ORDER
  • PARTITION
  • RANK
  • REFERENCES
  • SELECT
  • TABLE
  • TO
  • UPDATE
  • WHERE

解決方案

您有兩個選擇。

1. 不要將保留字當作識別符

最簡單的解決方案是避免將保留字用作識別碼。您可能可以找到另一個合理的列名,它不是保留字。

這樣做有幾個優點:

  • 它消除了您或其他使用您的資料庫的開發人員由於忘記或不知道特定標識符是保留字而意外寫入語法錯誤的可能性。 MySQL中有許多保留字,大多數開發人員不太可能知道所有這些保留字。透過首先不使用這些單詞,您避免了為自己或未來的開發人員設置陷阱。

  • 引用標識符的方式在SQL方言之間有所不同。雖然MySQL預設使用反引號引用標識符,符合ANSI標準的SQL(以及MySQL在ANSI SQL模式下,如此處所述)使用雙引號引用標識符。因此,使用反引號引用識別碼的查詢較不容易移植到其他SQL方言。

出於減少未來錯誤風險的考慮,通常比使用反引號引用識別碼更明智。

2. 使用反引號

如果無法重新命名表或列,請像前面引用的10.2 模式物件名稱中所述,用反引號(`)括起來。

下面是一個範例,示範了用法(取自10.3 關鍵字和保留字):

同樣,可以透過將關鍵字key用反引號括起來來修復問題中的查詢,如下所示:

INSERT INTO user_details (username, location, `key`) VALUES ('Tim', 'Florida', 42)"; ^ ^
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!