This question's answers are a community effort。编辑现有答案以改善此职位。它目前不接受新的答案或互动。
                            
                        
                    
                
                            
                    
我正在尝试执行一个简单的MySQL查询,如下所示:

INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)


但我收到以下错误:


  错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法以在第1行的'key) VALUES ('Tim', 'Florida', 42)'附近使用


我该如何解决该问题?

最佳答案

问题

在MySQL中,某些词(例如SELECTINSERTDELETE等)是保留字。由于它们具有特殊含义,因此每当您将它们用作表名,列名或其他类型的标识符时,MySQL都会将其视为语法错误-除非您用反引号将标识符引起来。

如官方文档中所述,在10.2 Schema Object Names部分(添加了强调):


  MySQL中的某些对象,包括数据库,表,索引,列,别名,视图,存储过程,分区,表空间和其他对象名,称为标识符。
  
  ...
  
  如果标识符包含特殊字符或为保留字,则在引用标识符时必须将其引用。
  
  ...
  
  标识符引号是反引号(“ `”):


关键字和保留字的完整列表可以在10.3 Keywords and Reserved Words部分中找到。在该页面中,后跟“(R)”的单词是保留单词。下面列出了一些保留字,包括许多容易引起此问题的字。




之前
通过
呼叫
案件
条件
删除
数据中心
描述



指数
插入
间隔


喜欢
限制

比赛

选项
要么
订购
划分
参考资料
选择


更新
哪里


解决方案

您有两个选择。

1.不要使用保留字作为标识符

最简单的解决方案就是避免使用保留字作为标识符。您可能会为您的列找到另一个合理的名称,该名称不是保留字。

这样做有两个优点:


它消除了您或其他使用数据库的开发人员由于忘记(或不知道)特定标识符是保留字而意外写入语法错误的可能性。 MySQL中有许多保留字,大多数开发人员不太可能全部了解。通过首先不使用这些词,可以避免为自己或将来的开发人员留下陷阱。
SQL方言中引用标识符的方式不同。默认情况下,MySQL使用反引号来引用标识符,而符合ANSI的SQL(实际上是ANSI SQL模式下的MySQL,如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)";               ^   ^

关于mysql - 由于在MySQL中使用保留字作为表或列名而导致的语法错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38112896/

10-16 13:12