MySQL-Syntaxfehler: Probleme, die durch die Verwendung reservierter Wörter als Tabellen- oder Spaltennamen verursacht werden
P粉937769356
P粉937769356 2023-08-21 20:17:23
0
1
458
<p>Ich versuche die folgende einfache MySQL-Abfrage auszuführen: </p> <pre class="brush:sql;toolbar:false;">INSERT INTO user_details (Benutzername, Standort, Schlüssel) WERTE („Tim“, „Florida“, 42) </pre> <p>Aber ich erhalte die folgende Fehlermeldung: </p> <blockquote> <p>FEHLER 1064 (42000): Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von <code>'key) VALUES ('Tim', ' Florida', 42)'</code> in Zeile 1</p> </blockquote> <p>Wie löse ich dieses Problem? </p>
P粉937769356
P粉937769356

Antworte allen(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)";               ^   ^
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage