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

标签 mysql reserved-words

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

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 Schema Object Names部分(强调):

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 Keywords and Reserved Words 部分找到。 。在该页面中,后面带有“(R)”的单词是保留字。下面列出了一些保留字,其中包括许多容易导致此问题的保留字。

  • 添加
  • 并且
  • 之前
  • 作者
  • 调用
  • 案例
  • 条件
  • 删除
  • 降序
  • 描述
  • 来自
  • 集团
  • 索引
  • 插入
  • 间隔
  • 关键
  • 喜欢
  • 限制
  • 匹配
  • 选项
  • 或者
  • 订购
  • 分区
  • 排名
  • 引用文献
  • 选择
  • 表格
  • 更新
  • 哪里

解决方案

您有两个选择。

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

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

这样做有几个优点:

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

  • SQL 方言之间引用标识符的方式有所不同。虽然 MySQL 默认使用反引号来引用标识符,但符合 ANSI 的 SQL(实际上是 ANSI SQL 模式下的 MySQL,如 here 所示)使用双引号来引用标识符。因此,用反引号引用标识符的查询不太容易移植到其他 SQL 方言。

纯粹是为了降低 future 发生错误的风险,这通常是比反引号引用标识符更明智的做法。

2。使用反引号

如果无法重命名表或列,请将有问题的标识符括在反引号 (`) 中,如之前引用 10.2 Schema Object Names 中所述。 .

演示用法的示例(取自 10.3 Keywords and Reserved Words ):

mysql> <strong>CREATE TABLE interval (begin INT, end INT);</strong>
ERROR 1064 (42000): You have an error in your SQL syntax.
near 'interval (begin INT, end INT)'

mysql> <strong>CREATE TABLE `interval` (begin INT, end INT);</strong> 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/57649531/

相关文章:

c++ - 保留的函数名可以重载吗?

javascript - 为什么 "float"是 JavaScript 中的保留字?

mysql - 仅当数字在mysql中不圆时如何获取小数

MySQL 将 3 个表连接在一起

python - 如何在不使用批量插入查询的情况下导入文件csv?

php - 查询错误,但我不知道它在哪里

javascript - x 是 Javascript FF/Safari 中的保留关键字而不是 IE 中的保留关键字吗?

mysql - 如何正确声明处理程序

caching - Laravel+Vue。缓存问题(其实只是保留变量名)

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