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

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

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

但是我收到以下错误:

你的SQL语法有错误; 检查对应于你的MySQL服务器版本的手册,在第1行的'key) VALUES ('Tim', 'Florida', 42)'附近使用正确的语法

我该如何解决这个问题?

问题

在MySQL中,某些单词如SELECTINSERTDELETE等是保留字。 由于它们有特殊的含义,只要将MySQL用作表名,列名或其他types的标识符,MySQL就会将其视为语法错误 – 除非用反引号包围标识符。

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

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

如果标识符包含特殊字符或是保留字 ,则只要引用标识符就必须引用该标识符。

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

关键字和保留字的完整列表可以在10.3关键字和保留字中find 。 在该页面中,“(R)”后面的单词是保留字。 下面列出了一些保留字,包括许多倾向于引起这个问题的字眼。

  • 之前
  • 通过
  • 呼叫
  • 案件
  • 条件
  • 删除
  • DESC
  • 描述
  • 指数
  • 间隔
  • IS
  • 喜欢
  • 限制
  • 比赛
  • 选项
  • 要么
  • 订购
  • 划分
  • 参考
  • select
  • UPDATE
  • 哪里

解决scheme

你有两个select。

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

最简单的解决scheme就是避免使用保留字作为标识符。 你也许可以为你的专栏find另一个不是保留字的合理名字。

这样做有两个好处:

  • 它消除了您或其他使用您数据库的开发人员由于遗忘或不知道某个标识符是保留字而意外地写入语法错误的可能性。 MySQL中有很多保留字,大多数开发人员不太可能知道所有这些字。 首先不要使用这些词汇,这样可以避免为自己或未来的开发者留下陷阱。

  • 在SQL方言中引用标识符的方法是不同的。 尽pipeMySQL使用反引号默认引用标识符,但ANSI兼容的SQL(实际上是ANSI SQL模式下的MySQL,如此处所述)使用双引号引用标识符。 因此,使用反引号引用标识符的查询不太容易移植到其他SQL方言中。

纯粹是为了减less未来错误的风险,这通常是一个明智的行为,而不是引用标识符。

2.使用反引号

如果重命名表或列是不可能的,请按照前面引用的10.2 Schema Object Names中的描述,将反义标识符包装成反引号( ` )。

演示使用示例(摘自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) 

同样,可以通过在反引号中包装关键字来解决问题中的查询,如下所示:

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