我试图执行一个简单的MySQL查询,如下所示:
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
但我得到了以下错误:
错误1064(42000):您的SQL语法有错误;请查看对应于MySQL服务器版本的手册,以获取在第1行
'key) VALUES ('Tim', 'Florida', 42)'
附近使用的正确语法我怎样才能解决这个问题?
最佳答案
问题
在MySQL中,某些单词如SELECT
、INSERT
、DELETE
等是保留字。由于它们有一个特殊的含义,每当您将它们用作表名、列名或其他类型的标识符时,MySQL都会将其视为语法错误,除非您用反勾号将标识符括起来。
如官方文件中所述,在10.2 Schema Object Names节中(重点增加):
MySQL中的某些对象(包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间和其他对象名)称为标识符。
...
如果标识符包含特殊字符或是保留字,则每次引用时都必须引用它。
...
标识符引号字符是倒勾(“`
”):
关键字和保留字的完整列表可以在10.3 Keywords and Reserved Words部分找到。在那一页中,后跟“(R)”的字是保留字。下面列出了一些保留字,包括许多可能引起这个问题的保留字。
添加
以及
以前
由
呼叫
案例
条件
删除
描述
描述
从
集团
在
索引
插入
间隔
是
钥匙
就像
限制
长
匹配
不是
选择权
或者
命令
分区
参考文献
选择
桌子
到
更新
哪里
解决方案
你有两个选择。
一。不要使用保留字作为标识符
最简单的解决方案是避免使用保留字作为标识符。您可能可以为您的列找到另一个合理的名称,而不是保留字。
这样做有两个好处:
它消除了您或使用数据库的其他开发人员由于忘记(或不知道)特定标识符是保留字而意外写入语法错误的可能性。MySQL中有很多保留字,大多数开发人员不太可能全部知道。首先不要使用这些词,可以避免给自己或未来的开发人员留下陷阱。
引用标识符的方式在SQL方言之间是不同的。默认情况下,MySQL使用倒勾号引用标识符,而符合ANSI的SQL(实际上,在ANSI-SQL模式下,如here所述)使用双引号引用标识符。因此,使用反勾号引用标识符的查询不太容易移植到其他SQL方言。
纯粹是为了减少将来出错的风险,这通常是一个比引用标识符更明智的做法。
2。使用反勾
如果无法重命名表或列,请按照前面10.2 Schema Object Names中的引用将有问题的标识符用反勾号(`
)括起来。
演示用法的示例(取自10.3 Keywords and Reserved Words):
mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax.
near 'interval (begin INT, end INT)'
mysql> CREATE TABLE `interval` (begin INT, end INT);
Query OK, 0 rows affected (0.01 sec)
类似地,问题中的查询可以通过将关键字
key
包装为反勾号来修复,如下所示:INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^