Ich versuche, eine einfache MySQL-Abfrage wie folgt auszuführen:
INSERT INTO user_details (username, location, key) VALUES ('Tim', 'Florida', 42)
Aber ich erhalte die folgende Fehlermeldung:
Fehler 1064 (42000): Sie haben einen Fehler in Ihrer SQL-Syntax; überprüfen Sie das Handbuch für Ihre MySQL-Serverversion auf die richtige Syntax für die Verwendung in der Nähe von
'key) VALUES ('Tim', 'Florida', 42)'
Zeile 1
Wie kann dieses Problem gelöst werden?
问题
在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
用反引号括起来来修复,如下所示: