8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

Hòa Nguyễn Coder 1月前

49 0

我正在尝试执行一个简单的 MySQL 查询,如下所示:INSERT INTO user_details (username, location, key)VALUES ('Tim', 'Florida', 42) 但是我收到以下错误:ERROR 1064 (42000): 您

我正在尝试执行如下简单的 MySQL 查询:

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

但我收到了以下错误:

错误 1064 (42000):您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,了解第 'key) VALUES ('Tim', 'Florida', 42)' 1 行

我该如何修复此问题?

帖子版权声明 1、本帖标题:由于在 MySQL 中使用保留字作为表名或列名而导致语法错误
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Hòa Nguyễn Coder在本站《mysql》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 如果您被重定向到这里,但没有收到任何错误消息,则可能是您没有进行错误检查。请寻求有关如何针对您的语言、库和/或工具进行检查的建议 — 不要每次出现问题时都在这里发帖。谢谢!

  • @abhitalks:因为每个实现都有不同的 SQL 风格,适用于 MySQL 的不一定适用于其他风格。参考问题可能会浮现出来

  • 问题

    在 MySQL 中,某些词(例如 SELECT , INSERT , DELETE etc.)是保留字。由于它们具有特殊含义,因此,只要您将它们用作表名、列名或其他类型的标识符,MySQL 都会将其视为语法错误 - 除非您用反引号将标识符括起来。

    正如官方文档中所述,在第 10.2 节“架构对象名称” (重点添加):

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

    ...

    如果标识符包含特殊字符或 保留字 则在引用它时 必须用

    ...

    标识符引号字符是 反引号 (\' ` \'):

    完整的关键字和保留字列表可参见第 10.3 节“关键字和保留字” 。在该页面中,后面带有 \'(R)\' 的字是保留字。下面列出了一些保留字,其中包括许多容易导致此问题的字。

    • 添加
    • 经过
    • 称呼
    • 案件
    • 健康)状况
    • 删除
    • 降序
    • 描述
    • 团体
    • 指数
    • 插入
    • 间隔
    • 钥匙
    • 喜欢
    • 限制
    • 长的
    • 匹配
    • 不是
    • 选项
    • 或者
    • 命令
    • 分割
    • 参考
    • 选择
    • 桌子
    • 更新
    • 在哪里

    解决方案

    您有两个选择。

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

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

    这样做有几个好处:

    • p11

    • p12

    纯粹为了减少将来犯错的风险,这通常是比用反引号括住标识符更明智的做法。

    2. 使用反引号

    如果无法重命名表或列,请将有问题的标识符括在反引号 ( ` ) 中,如前面 10.2 架构对象名称 .

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

    mysql> 创建表间隔(开始 INT,结束 INT);
    ERROR 1064 (42000): You have an error in your SQL syntax.
    near 'interval (begin INT, end INT)'
    

    mysql>CREATE TABLE`interval`(开始 INT,结束 INT);查询 OK,受影响 0 行(0.01 秒)

    类似地,可以通过将关键字包裹 key 在反引号中来修复问题的查询,如下所示:

    INSERT INTO user_details (username, location, `key`)
    VALUES ('Tim', 'Florida', 42)";               ^   ^
    
  • -1. 我认为在参考答案中建议使用不带反引号的 begin 和 end 特别邪恶。更好的做法是使用反引号,句点,而不必知道哪个关键字是保留的或非保留的。

  • @MarcAlff:begin 和 end 不是保留字。上面的例子只是为了演示如何使用反引号解决错误消息。而且,不使用保留字是一种更好的做法,而不是盲目地用反引号引用所有标识符,即使它们不需要。

  • 我同意解决方案 1 更好,因为有人可以真正选择标识符名称。当名称无法更改时,如解决方案 2 中所示,必须调查哪些标识符是关键字,以及这些关键字是否保留(即使未来版本?),这很复杂。顺便说一句,删除了 -1,因为示例实际上来自手册。

  • 随着新版本的发布,MySQL 中经常会创建新的保留字。例如,MySQL 5.7 中的 NONBLOCKING。系统地引用往往对更改更稳健,并有助于升级。至于删除 -1,我很乐观。您说得对,我的删除由于这个计时器而失败了。

  • 使用保留字作为标识符的另一个缺点是:它使得无法搜索代码。如果您将其中一个表命名为 Table,则搜索它将返回太多误报。

返回
作者最近主题: