我正在尝试执行一个简单的MySQL查询,如下所示:
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
但是我得到了以下错误:
错误1064 (42000):您的SQL语法中有一个错误;请查看与您的MySQL服务器版本相对应的手册,了解在第1行的
'key) VALUES ('Tim', 'Florida', 42)'
附近使用的正确语法
我如何解决这个问题?
发布于 2014-05-03 23:29:23
问题所在
在MySQL中,某些单词,如SELECT
、INSERT
、DELETE
等都是保留字。因为它们有特殊的含义,所以每当您将它们用作表名、列名或其他类型的标识符时,MySQL都会将其视为语法错误-除非您用反引号将标识符括起来。
如官方文件中所述,在部分(增加了重点):
MySQL中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间和其他对象名称,都称为。
..。
如果标识符包含特殊字符或是保留字,则无论何时引用它,都必须将其引起来。
..。
标识符引号字符是反引号 ("`
"):
关键字和保留字的完整列表可以在一节中找到。在该页中,后跟"(R)“的单词是保留字。下面列出了一些保留字,包括许多可能导致此问题的保留字。
解决方案
您有两个选择。
1.不要使用保留字作为标识符
最简单的解决方案是避免使用保留字作为标识符。您可能会为您的列找到另一个合理的名称,而不是保留字。
这样做有几个优点:
在不同的方言中,引用标识符的方式是不同的。默认情况下,MySQL使用反引号来引用标识符,而符合ANSI的SQL (以及ANSI SQL模式中的MySQL,如here所指出的)使用双引号来引用标识符。因此,用反引号将标识符引起来的查询不太容易移植到其他SQL方言。
纯粹为了减少将来出错的风险,这通常是一种比使用反引号引用标识符更明智的做法。
2.使用反引号
如果无法重命名表或列,请按照前面的引号中的说明,将有问题的标识符括在反引号(`
)中。
演示用法的示例(取自10.3 Keywords and Reserved Words):
SQL TABLE interval (begin INT,end INT);ERROR 1064 (42000):
语法中存在错误。near 'interval (begin INT,end INT)‘mysql> CREATE TABLE
interval
(begin INT,end INT);查询正常,0行受影响(0.01秒)
同样,问题中的查询可以通过将关键字key
括在反引号中来修复,如下所示:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^
https://stackoverflow.com/questions/23446377
复制相似问题