当前位置: 首页 > 知识库问答 >
问题:

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

朱渝
2023-03-14

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

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

但我得到了以下错误:

错误1064(42000):SQL语法中有错误; 请检查与MySQL server版本相对应的手册,以确定使用第1行'key)值('tim','florida',42)'附近的正确语法

我该如何解决这个问题?

共有1个答案

诸葛砚
2023-03-14

在MySQL中,某些单词如selectinsertdelete等是保留单词。 由于它们具有特殊的含义,所以每当您将它们用作表名,列名或其他类型的标识符时,MySQL都将其视为语法错误--除非您在标识符周围用反勾号。

如官方文档中所述,在第10.2节Schema对象名称(着重号后加)中:

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

。。。

如果标识符包含特殊字符或为保留字,则无论何时引用都必须引用该标识符。

。。。

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

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

  • 添加
  • 之前
  • 呼叫
  • 大小写
  • 条件
  • 删除
  • 说明
  • 描述
  • 发件人
  • in
  • 索引
  • 插入
  • 间隔
  • 密钥
  • 喜欢
  • 限制
  • 匹配
  • 选项
  • 订单
  • 分区
  • 引用
  • 选择
  • 更新
  • 其中

你有两个选择。

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

这样做有几个好处:

>

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

    引用标识符的方法因SQL方言而异。 默认情况下,MySQL使用反勾号来引用标识符,而符合ANSI的SQL(确实是ANSI SQL模式下的MySQL,如本文所述)使用双引号来引用标识符。 因此,引用带后勾号的标识符的查询不太容易移植到其他SQL方言。

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

    如果不可能重命名表或列,请按照前面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)";               ^   ^
    

  •  类似资料:
    • 问题内容: 这个问题的答案是 社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 我正在尝试执行一个简单的MySQL查询,如下所示: 但我收到以下错误: 错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取在第1行附近使用的正确语法 我该如何解决该问题? 问题答案: 在MySQL中,某些字词(,等等)是保留字。由于它们具有特殊含义,因此

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

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

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

    • 问题内容: 我尝试使用MySQL: 我得到这个: 注意: 此查询是自动生成的,条件基于表别名。 为什么会出现此错误? 有什么方法可以在where子句中使用表别名? 这是MySQL特有的吗? 问题答案: 您可以这样使用SQL:

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

    • 问题内容: 我正在尝试将表名传递到我的mysql存储过程中,以使用此sproc从其他表中进行选择,但是它不起作用… 这是我正在尝试的: 我也尝试过不带@符号,它只是告诉我TableName不存在…我知道:) 问题答案: 它取决于DBMS,但是这种表示法通常需要Dynamic SQL,并且会遇到一个问题,即函数执行时的返回值取决于输入。这给系统带来了麻烦。作为一般规则(因此可能会有例外),DBMS不

    • 问题内容: 除了MSSQL和SQLite之外,我还将扩展现有应用程序的数据层以与Firebird 2.5一起使用,但是我遇到了一个绊脚石。 我有一个名为TimeStamp的字段,该字段将数据/时间存储为TimeStamp类型。在类型为datetime的MSSQL和SQLite下,此方法可以正常工作,但在Firebird下适用。以下SQL: 似乎有效,但是TimeStamp字段以字段名称“ CONS