我正在try 执行一个简单的MySQL查询,如下所示:
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
但我得到了以下错误:
错误1064(42000):您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获取第1行中接近
'key) VALUES ('Tim', 'Florida', 42)'
的正确语法
我如何解决这个问题?
我正在try 执行一个简单的MySQL查询,如下所示:
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
但我得到了以下错误:
错误1064(42000):您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获取第1行中接近
'key) VALUES ('Tim', 'Florida', 42)'
的正确语法
我如何解决这个问题?
在MySQL中,某些单词,如 Select
、在里面SERT
、删go
等是保留字.因为它们有一个特殊的含义,所以每当您将它们用作表名、列名或其他类型的标识符时,MySQL都会将其视为一个语法错误——除非您在标识符周围加上反勾.
如官方文件中所述,在第10.2 Schema Object Names节(增加强调部分)中:
MySQL中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间和其他对象名,称为100.
...
如果某个标识符包含特殊字符或是100,则在每次引用时都要引用它.
...
标识符引号字符是101("
`
"):
关键字和保留字的完整列表见第10.3 Keywords and Reserved Words节.在该页面中,后跟"(R)"的单词是保留单词.下面列出了一些保留字,包括许多可能导致此问题的保留字.
你有两个 Select .
最简单的解决方案就是避免使用保留字作为标识符.你可能会为你的专栏找到另一个合理的名字,而不是保留字.
这样做有两个好处:
它消除了您或其他使用数据库的开发人员由于忘记或不知道某个特定标识符是保留字而意外编写语法错误的可能性.MySQL中有很多保留字,大多数开发人员不太可能全都知道.如果一开始不使用这些词,就可以避免给自己或future 的开发人员留下trap .
引用标识符的方式在不同的SQL方言中有所不同.默认情况下,MySQL使用反勾号引用标识符,而符合ANSI标准的SQL(实际上是ANSI SQL模式下的MySQL,如here所述)使用双引号引用标识符.因此,使用反勾号引用标识符的查询不太容易移植到其他SQL方言中.
纯粹为了降低future 出错的风险,这通常是一种比倒勾引用标识符更明智的做法.
如果无法重命名表或列,请将有问题的标识符用反勾号(`
)括起来,如前面引用的10.2 Schema Object Names中所述.
举例说明用法(取自10.3 Keywords and Reserved Words):
mysql> CREATE 桌子 interval (begin 在里面T, end 在里面T); ERR或 1064 (42000): You have an error in your SQL syntax. near 'interval (begin 在里面T, end 在里面T)'
mysql>;CREATE 桌子 `interval` (begin 在里面T, end 在里面T);
类似地,可以通过将关键字key
包装在backticks中来修复问题的查询,如下所示:
在里面SERT 在里面到 user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^