提问人: 提问时间:5/3/2014 最后编辑:12 revs, 5 users 50%Amal Murali 更新时间:2/8/2021 访问量:221521
由于在MySQL中使用保留字作为表名或列名而导致的语法错误
Syntax error due to using a reserved word as a table or column name in MySQL
问:
我正在尝试执行一个简单的MySQL查询,如下所示:
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
但是我收到以下错误:
错误 1064 (42000):SQL 语法中有错误;查看与您的MySQL服务器版本相对应的手册,了解在第1行附近使用的正确语法
'key) VALUES ('Tim', 'Florida', 42)'
如何解决此问题?
答:
问题
在MySQL中,某些单词(如,等)是保留字。由于它们具有特殊的含义,因此每当您将它们用作表名、列名或其他类型的标识符时,MySQL 都会将其视为语法错误 - 除非您用反引号将标识符括起来。SELECT
INSERT
DELETE
正如官方文档中所指出的,在第 10.2 节 架构对象名称(强调后加):
MySQL中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间和其他对象名称,称为标识符。
...
如果标识符包含特殊字符或为保留字,则在引用它时必须引用它。
...
标识符引号字符是反引号 (“”):
`
可以在第 10.3 节 关键字和保留字中找到关键字和保留字的完整列表。在该页面中,后跟“(R)”的单词是保留字。下面列出了一些保留字,包括许多容易导致此问题的保留字。
- 加
- 和
- 以前
- 由
- 叫
- 箱
- 条件
- 删除
- DESC
- 描述
- 从
- 群
- 在
- 指数
- 插入
- 间隔
- 是
- 钥匙
- 喜欢
- 限制
- 长
- 火柴
- 不
- 选择
- 或
- 次序
- 分区
- 排
- 引用
- 选择
- 桌子
- 自
- 更新
- 哪里
解决方案
您有两种选择。
1. 不要使用保留字作为标识符
最简单的解决方案是避免使用保留字作为标识符。您可以为您的列找到另一个不是保留字的合理名称。
这样做有几个优点:
它消除了您或使用数据库的其他开发人员由于忘记或不知道特定标识符是保留字而意外编写语法错误的可能性。MySQL中有许多保留字,大多数开发人员不太可能知道所有这些保留字。首先不使用这些词,可以避免为自己或未来的开发人员留下陷阱。
引用标识符的方法因 SQL 方言而异。虽然MySQL默认使用反引号来引用标识符,但符合ANSI标准的SQL(以及ANSI SQL模式下的MySQL,如此处所述)使用双引号来引用标识符。因此,用反引号引用标识符的查询不太容易移植到其他 SQL 方言。
纯粹为了降低未来出错的风险,这通常是比反引号引用标识符更明智的做法。
2.使用反引号
如果无法重命名表或列,请将有问题的标识符括在反引号 () 中,如前面引用的 10.2 架构对象名称中所述。`
演示用法的示例(摘自 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)
同样,可以通过将关键字括在反引号中来修复问题的查询,如下所示:key
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^
评论
begin
end
Table
评论
MySQL
SQLServer
C
C#
VB