当前位置: 首页 > 面试题库 >

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

储法
2023-03-14
问题内容

这个问题的答案是 社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。

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

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

但我收到以下错误:

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

我该如何解决该问题?


问题答案:

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

如官方文档中所述,在 10.2模式对象名称
添加了重点)中:

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

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

标识符引号是 反引号 (“ ```”):

有关关键字和保留字的完整列表,请参见第
10.3
节“
关键字和保留字”
。在该页面中,后跟“(R)”的单词是保留单词。下面列出了一些保留字,包括许多容易引起此问题的字。

  • 之前
  • 通过
  • 呼叫
  • 案件
  • 健康)状况
  • 删除
  • 数据中心
  • 描述
  • 指数
  • 间隔
  • 喜欢
  • 限制
  • 比赛
  • 选项
  • 要么
  • 订购
  • 划分
  • 参考资料
  • 选择
  • 更新
  • 哪里

解决方案

您有两个选择。

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

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

这样做有两个优点:

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

  • SQL方言中引用标识符的方式不同。虽然MySQL使用反引号在默认情况下,符合ANSI标准SQL引用标识符(实际上在MySQL ANSI SQL模式,如注意这里)用来引用标识符双引号。这样,用反引号引起来的标识符查询不易移植到其他SQL方言中。

纯粹是为了减少将来发生错误的风险,这通常比反引号引用标识符更明智。

2.使用反引号

如果无法重命名表或列,请```按照
10.2架构对象名称
前面的报价中的描述,将有问题的标识符包装在反引号()中。

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

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


 类似资料:
  • 问题内容: 这是一些简单的代码,但我只是不知道为什么我不能使用这个词作为表的实体 我意识到如果我使用key,我将无法使用“ key”,mysql将要求我检查语法,但是如果我使用“ id”或任何其他表,将会创建该表。 有人知道如何将实体名称创建为密钥吗?这并不重要,因为我只能使用id而不是key,但是由于我发现了此错误,所以我不知道是否有办法使它起作用。 问题答案: 您仍然可以使用。只要用反引号包起

  • 问题内容: 有什么技巧可以将Java保留字用作变量,方法,类,接口,包或枚举常量名称? 问题答案: 不,没有办法。这就是为什么它们被标记为“保留”的原因。

  • 问题内容: 在此 coderanch链接上,我发现以下注释将给编译器错误:- 原因是,Unicode序列直接由其对应的实际字符替换。由于’\ u000a’对应于newLine字符,因此将newLine放置在找到’\ u000a’的位置。 我的问题是,“由于注释,还有其他方式导致编译错误吗?” 问题答案: 如果在注释()中定义了不推荐使用的函数,并且设置了使用不推荐使用的方法时编译器抛出错误(至少可

  • 问题内容: 我收到错误消息 “您的SQL语法有错误;请检查与您的MySQL服务器版本相对应的手册,以找到在第1行的“ orderr”附近使用的正确语法” -因此,我认为错误是用了两个 ‘, 但是在我的代码中我没有用 ‘ 。注意,该表实际上被命名为订购者。 问题答案: 在大多数数据库中,您无法参数化表名称之类的对象名称,在MySQL中,理论上您可以做到,因为默认情况下,MySQL Connector

  • 问题内容: 保留字可以用作对象的属性名称吗? 先前的堆栈溢出问题(浏览器支持在JavaScript中使用保留字作为属性名称)间接引发了此问题。答案似乎是AlexWayne的普遍共识: 您可以使用这些单词,但只能将其用作字符串,而不能用作速记属性。 虽然我认为他们在这方面可能比我了解更多,并且在某些情况下使用保留字可能不是一个 好主意 ,但基于两点,我认为他们的结论是错误的: 使用保留字作为“速记”

  • 问题内容: 分类法是一门基于共有特征来定义和命名生物有机体的科学。将有机体分类为分类群(单数:分类群),并且将这些分类分类。现代使用的主要等级是域,王国,门,阶级,秩序,家庭,属和物种。Wikipedia中有关分类学和分类学等级的更多信息。 在 Wikipedia 中的 分类分类中* 的 红狐狸 示例之后,我需要创建一个JSON输出,如下所示: * __ 由于Django的REST框架创建一个基于