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

Syntax error due to using a reserved word as a table or column name in MySQL

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

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

但我得到了以下错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key) VALUES ('Tim', 'Florida', 42)' at line 1

我如何解决这个问题?


问题

在MySQL中,某些词如SELECTINSERTDELETE等是保留词。因为它们有特殊的含义,所以每当您将它们用作表名、列名或其他类型的标识符时,MySQL都会将其视为语法错误——除非您用反勾号将标识符括起来。

如官方文件中所述,在第10.2节中,模式对象名(增加了重点):

Certain objects within MySQL, including database, table, index, column, alias, view, stored procedure, partition, tablespace, and other object names are known as identifiers.

...

If an identifier contains special characters or is a reserved word, you must quote it whenever you refer to it.

...

The identifier quote character is the backtick ("`"):

关键字和保留字的完整列表可在第10.3节关键字和保留字中找到。在该页中,后面跟着"(r)"的词是保留字。下面列出了一些保留字,包括许多可能导致此问题的保留字。

  • 添加
  • 以前
  • 通过
  • 呼叫
  • 案例
  • 条件
  • 删除
  • DESC
  • 描述
  • 索引
  • 插入
  • 间隔
  • 钥匙
  • 喜欢
  • 极限
  • 比赛
  • 不是
  • 选择权
  • 秩序
  • 分区
  • 参考文献
  • 选择
  • 更新
  • 哪里

解决方案

你有两个选择。

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

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

这样做有两个好处:

  • 它消除了您或其他使用数据库的开发人员由于忘记或不知道特定标识符是保留字而意外编写语法错误的可能性。MySQL中有许多保留字,大多数开发人员不太可能知道它们的全部。首先不要使用这些词,这样可以避免给自己或未来的开发人员留下陷阱。

  • 在SQL方言中引用标识符的方式不同。虽然MySQL默认情况下使用倒勾来引用标识符,但符合ANSI的SQL(实际上,在ansi-sql模式下,如本文所述)使用双引号来引用标识符。因此,使用反勾号引用标识符的查询不太容易移植到其他SQL方言。

纯粹是为了减少将来出错的风险,这通常比倒勾引用标识符更明智。

2。使用倒计时

如果无法重命名表或列,请将有问题的标识符用反勾号(`)括起来,如前面10.2模式对象名中的引号所述。

演示用法的示例(取自10.3关键字和保留字):

1
2
3
4
5
6
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包装在倒勾中来修复,如下所示:

1
2
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)";               ^   ^