问题
在 MySQL 中,某些词(例如 SELECT
, INSERT
, DELETE
etc.)是保留字。由于它们具有特殊含义,因此,只要您将它们用作表名、列名或其他类型的标识符,MySQL 都会将其视为语法错误 - 除非您用反引号将标识符括起来。
正如官方文档中所述,在第 10.2 节“架构对象名称” (重点添加):
MySQL 中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间和其他对象名称被称为 标识符 .
...
如果标识符包含特殊字符或 保留字 , 则在引用它时 必须用
...
标识符引号字符是 反引号 (\' `
\'):
完整的关键字和保留字列表可参见第 10.3 节“关键字和保留字” 。在该页面中,后面带有 \'(R)\' 的字是保留字。下面列出了一些保留字,其中包括许多容易导致此问题的字。
-
添加
-
和
-
前
-
经过
-
称呼
-
案件
-
健康)状况
-
删除
-
降序
-
描述
-
从
-
团体
-
在
-
指数
-
插入
-
间隔
-
是
-
钥匙
-
喜欢
-
限制
-
长的
-
匹配
-
不是
-
选项
-
或者
-
命令
-
分割
-
秩
-
参考
-
选择
-
桌子
-
到
-
更新
-
在哪里
解决方案
您有两个选择。
1. 不要使用保留字作为标识符
最简单的解决方案就是避免使用保留字作为标识符。您可能可以为您的列找到另一个非保留字的合理名称。
这样做有几个好处:
纯粹为了减少将来犯错的风险,这通常是比用反引号括住标识符更明智的做法。
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)"; ^ ^