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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (31)

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

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

但我得到了以下错误:

您的sql语法出现错误;请检查与MySQL服务器版本相对应的手册,以获得正确的语法。'key) VALUES ('Tim', 'Florida', 42)'在第1行

我怎样才能解决这个问题?

提问于
用户回答回答于

问题

在MySQL中,某些单词如SELECT,,,INSERT,,,DELETE等等都是保留词。因为它们有特殊的含义,所以MySQL将其作为一个语法错误来处理,只要将它们用作表名、列名或其他类型的标识符--除非用Backticks包围标识符。

如官方文件第一节所述10.2架构对象名(强调后加):

MySQL中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间和其他对象名称称为标识符... ... 如果标识符包含特殊字符,或者是保留字只要你提到它,就引用它。 ... 标识符引号字符是反勾(“`“)

关键字和保留词的完整列表可在部分中找到。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
  • REFERENCES
  • SELECT
  • TABLE
  • TO
  • UPDATE
  • WHERE

你有两个选择。

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

这样做有两个好处:

  • 它消除了你或其他使用数据库的开发人员由于忘记(或不知道)特定标识符是保留字而意外编写语法错误的可能性。MySQL中有许多保留词,大多数开发人员不太可能知道所有这些单词。首先,不要使用这些词,这样就可以避免给自己或未来的开发人员留下陷阱。
  • 引用标识符的方法因SQL方言而异。虽然MySQL默认使用backticks来引用标识符,但符合ansi标准的sql(实际上在ansi sql模式下使用mysql,如前所述)。使用双引号引用标识符。因此,引用带有Backticks的标识符的查询不太容易移植到其他SQL方言。

纯粹是为了减少未来出错的风险,这通常比反向引用标识符更明智。

2.使用背板

如果不可能重命名表或列,请将违规标识符包装为backticks(`)如前面引用的10.2架构对象名...

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

mysql>创建表间隔(开始int,结束int);错误1064(42000):您在SQLsyntax.近‘Interval(BEGINT,Endint)’mysql>CREATETABLE中出现了一个错误interval(开始int,end int);查询确定,0行受影响(0.01秒)

类似地,可以通过包装关键字来修复来自问题的查询。key如下所示:

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

扫码关注云+社区