搜索

首页  >  问答  >  正文

MySQL语法错误:使用保留字作为表名或列名所引起的问题

<p>我正在尝试执行以下简单的MySQL查询:</p> <pre class="brush:sql;toolbar:false;">INSERT INTO user_details (username, location, key) VALUES ('Tim', 'Florida', 42) </pre> <p>但是我得到了以下错误:</p> <blockquote> <p>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 <code>'key) VALUES ('Tim', 'Florida', 42)'</code> at line 1</p> </blockquote> <p>我该如何解决这个问题?</p>
P粉937769356P粉937769356466 天前447

全部回复(1)我来回复

  • P粉541796322

    P粉5417963222023-08-22 09:55:13

    问题

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

    正如官方文档中所指出的,在第10.2 模式对象名称节中(强调添加):

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

    • ADD
    • AND
    • BEFORE
    • BY
    • CALL
    • CASE
    • CONDITION
    • DELETE
    • DESC
    • DESCRIBE
    • FROM
    • GROUP
    • IN
    • INDEX
    • INSERT
    • INTERVAL
    • IS
    • KEY
    • LIKE
    • LIMIT
    • LONG
    • MATCH
    • NOT
    • OPTION
    • OR
    • ORDER
    • PARTITION
    • RANK
    • REFERENCES
    • SELECT
    • TABLE
    • TO
    • UPDATE
    • WHERE

    解决方案

    您有两个选择。

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

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

    这样做有几个优点:

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

    • 引用标识符的方式在SQL方言之间有所不同。虽然MySQL默认使用反引号引用标识符,符合ANSI标准的SQL(以及MySQL在ANSI SQL模式下,如此处所述)使用双引号引用标识符。因此,使用反引号引用标识符的查询不太容易移植到其他SQL方言。

    出于减少未来错误风险的考虑,通常比使用反引号引用标识符更明智。

    2. 使用反引号

    如果无法重命名表或列,请像前面引用的10.2 模式对象名称中所述,用反引号(`)括起来。

    下面是一个示例,演示了用法(取自10.3 关键字和保留字):

    同样,可以通过将关键字key用反引号括起来来修复问题中的查询,如下所示:

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

    回复
    0
  • 取消回复