首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >由于在MySQL中使用保留字作为表名或列名而导致的语法错误

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

Stack Overflow用户
提问于 2014-05-03 23:29:23
回答 1查看 177.4K关注 0票数 48

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

代码语言:javascript
复制
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)

但是我得到了以下错误:

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

我如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-03 23:29:23

问题所在

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

如官方文件中所述,在部分(增加了重点):

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

..。

如果标识符包含特殊字符或是保留字,则无论何时引用它,都必须将其引起来。

..。

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

关键字和保留字的完整列表可以在一节中找到。在该页中,后跟"(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中有许多保留字,大多数开发人员不太可能知道所有这些保留字。通过从一开始就不使用这些词,你就避免了给自己或未来的开发人员留下陷阱。

在不同的方言中,引用标识符的方式是不同的。默认情况下,MySQL使用反引号来引用标识符,而符合ANSI的SQL (以及ANSI SQL模式中的MySQL,如here所指出的)使用双引号来引用标识符。因此,用反引号将标识符引起来的查询不太容易移植到其他SQL方言。

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

2.使用反引号

如果无法重命名表或列,请按照前面的引号中的说明,将有问题的标识符括在反引号(`)中。

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

SQL TABLE interval (begin INT,end INT);ERROR 1064 (42000):

语法中存在错误。near 'interval (begin INT,end INT)‘mysql> CREATE TABLE interval (begin INT,end INT);查询正常,0行受影响(0.01秒)

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

代码语言:javascript
复制
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)";               ^   ^
票数 326
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23446377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档