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

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

但我得到了以下错误:

错误1064(42000):您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获取第1行中接近'key) VALUES ('Tim', 'Florida', 42)'的正确语法

我如何解决这个问题?

推荐答案

The Problem

在MySQL中,某些单词,如 Select 在里面SERT删go 等是保留字.因为它们有一个特殊的含义,所以每当您将它们用作表名、列名或其他类型的标识符时,MySQL都会将其视为一个语法错误——除非您在标识符周围加上反勾.

如官方文件中所述,在第10.2 Schema Object Names节(增加强调部分)中:

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

...

如果某个标识符包含特殊字符或是100,则在每次引用时都要引用它.

...

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

关键字和保留字的完整列表见第10.3 Keywords and Reserved Words节.在该页面中,后跟"(R)"的单词是保留单词.下面列出了一些保留字,包括许多可能导致此问题的保留字.

  • 添加
  • 之前
  • 通过
  • 呼叫
  • case
  • 条件
  • 删go
  • 描述
  • 描述RIBE
  • 从…起
  • 在里面
  • 在里面DEX
  • 在里面SERT
  • 在里面TERVAL
  • keys
  • 喜欢
  • 限度
  • 长的
  • 火柴
  • 选项
  • 或DER
  • 隔断
  • 等级
  • 推荐人
  • Select
  • 桌子
  • 使现代化
  • 哪里

The Solution

你有两个 Select .

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

最简单的解决方案就是避免使用保留字作为标识符.你可能会为你的专栏找到另一个合理的名字,而不是保留字.

这样做有两个好处:

  • 它消除了您或其他使用数据库的开发人员由于忘记或不知道某个特定标识符是保留字而意外编写语法错误的可能性.MySQL中有很多保留字,大多数开发人员不太可能全都知道.如果一开始不使用这些词,就可以避免给自己或future 的开发人员留下trap .

  • 引用标识符的方式在不同的SQL方言中有所不同.默认情况下,MySQL使用反勾号引用标识符,而符合ANSI标准的SQL(实际上是ANSI SQL模式下的MySQL,如here所述)使用双引号引用标识符.因此,使用反勾号引用标识符的查询不太容易移植到其他SQL方言中.

纯粹为了降低future 出错的风险,这通常是一种比倒勾引用标识符更明智的做法.

2.使用反勾号

如果无法重命名表或列,请将有问题的标识符用反勾号(`)括起来,如前面引用的10.2 Schema Object Names中所述.

举例说明用法(取自10.3 Keywords and Reserved Words):

mysql> CREATE 桌子 interval (begin 在里面T, end 在里面T);
ERR或 1064 (42000): You have an error in your SQL syntax.
near 'interval (begin 在里面T, end 在里面T)'

mysql>;CREATE 桌子 `interval` (begin 在里面T, end 在里面T);

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

在里面SERT 在里面到 user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)";               ^   ^

Mysql相关问答推荐

SQL Store Procedure Throwing [42000][1064]您在EXECUTE stat USING声明上的SQL语法中有错误

使用MySQL工作台导出具有数据的数据库表并导入到其字段具有不同数据类型的同一表中

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

计算符合字段值只能包含一种事件类型这一事实的记录

Mysql:使用like Select 查询

获取最大登录应用程序用户数以及何时

避免多个SQL查询的重构代码

Select 同一张表中的结果数?

如何使用等于、喜欢和不等于在 json 字段上编写查询?

如何在Mysql中使用With和Values

从 R 脚本创建新的 MYSQL 数据库

使用 Having 表达式连接多个表

如何在不使用子查询的情况下按最小日期计算新用户?

按 SQL 删除分组前的重复项

为什么 ORDER BY 'id' 'desc' 不返回语法错误?

如何在 MySQL 中 Select 字段具有最小值的数据?

MySQL - 基于同一表中的行求和列值

将sql查询的结果写入mysql中的文件

在 MySQL 中存储 IPv6 地址

在 MySQL 中仅 Select 仅包含字母数字字符的行