由于在MySQL中使用保留字作为表或列名称而导致语法错误

时间:2014-05-03 15:29:23

标签: mysql reserved-words

我试图执行一个简单的MySQL查询,如下所示:

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

但我收到以下错误:

  

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

如何解决问题?

1 个答案:

答案 0 :(得分:242)

问题

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

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

  

MySQL中的某些对象,包括数据库,表,索引,列,别名,视图,存储过程,分区,表空间和其他对象名称,称为 标识符

     

...

     

如果标识符包含特殊字符或 保留字 ,则必须引用它时引用它。

     

...

     

标识符引号字符是<​​strong> 反引号 (“`”):

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

  • ADD
  • BEFORE
  • BY
  • CALL
  • CASE
  • CONDITION
  • DELETE
  • DESC
  • DESCRIBE
  • FROM
  • GROUP
  • INDEX
  • INSERT
  • INTERVAL
  • IS
  • KEY
  • LIKE
  • LIMIT
  • LONG
  • MATCH
  • 不是
  • OPTION
  • ORDER
  • PARTITION
  • 参考
  • 选择
  • TO
  • 更新
  • WHERE

解决方案

您有两种选择。

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)";               ^   ^