我正在尝试执行一个简单的 MySQL 查询,如下所示:
INSERT INTO user_details (username, location, key) VALUES ('Tim', 'Florida', 42)
但我收到以下错误:
错误 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在
'key) VALUES ('Tim', 'Florida', 42)'
第 1 行附近使用的正确语法
如何解决这个问题?
P粉8113290342023-10-15 19:29:27
在MySQL中,某些单词如SELECT
、INSERT
、DELETE
等是保留字。由于它们具有特殊含义,因此每当您将它们用作表名、列名或其他类型的标识符时,MySQL 都会将其视为语法错误 - 除非您用反引号将标识符括起来。
正如官方文档中所述,在10.2 架构对象名称 em>(强调):
关键字和保留字的完整列表可以在10.3关键字部分找到和保留字。在该页面中,后面带有“(R)”的单词是保留字。下面列出了一些保留字,其中包括许多容易导致此问题的保留字。
您有两个选择。
最简单的解决方案就是避免使用保留字作为标识符。您也许可以为您的列找到另一个合理的名称,该名称不是保留字。
这样做有几个优点:
它消除了您或其他使用数据库的开发人员由于忘记或不知道特定标识符是保留字而意外编写语法错误的可能性。 MySQL 中有很多保留字,大多数开发人员不太可能知道所有这些保留字。通过首先不使用这些词,您可以避免给自己或未来的开发人员留下陷阱。
SQL 方言之间引用标识符的方式有所不同。虽然 MySQL 默认使用反引号来引用标识符,但符合 ANSI 的 SQL(实际上是 ANSI SQL 模式下的 MySQL,如此处所述) ) 使用双引号来引用标识符。因此,用反引号引用标识符的查询不太容易移植到其他 SQL 方言。
纯粹是为了降低未来发生错误的风险,这通常是比反引号引用标识符更明智的做法。
如果无法重命名表或列,请将有问题的标识符括在反引号 (`
) 中,如前面引用的 10.2 架构对象名称。
演示用法的示例(取自10.3 关键字和保留字 ):
同样,问题中的查询可以通过将关键字 key
用反引号括起来来修复,如下所示:
INSERT INTO user_details (username, location, `key`) VALUES ('Tim', 'Florida', 42)"; ^ ^