在mysql中使用保留字作为表名或列名时出现语法错误

3ks5zfa0  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(390)

**这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或互动。

我正在尝试执行一个简单的mysql查询,如下所示:

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

但我得到了以下错误:
错误1064(42000):您的sql语法有错误;请查看与mysql服务器版本对应的手册,以获得正确的语法 'key) VALUES ('Tim', 'Florida', 42)' 在1号线
我如何解决这个问题?

wsewodh2

wsewodh21#

问题

在mysql中,某些词 SELECT , INSERT , DELETE 等是保留字。因为它们有一个特殊的含义,所以每当您将它们用作表名、列名或其他类型的标识符时,mysql都会将其视为语法错误—除非您用反记号将标识符括起来。
如官方文件中所述,在第10.2节模式对象名称中(添加强调):
mysql中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间和其他对象名,称为标识符。
...
如果标识符包含特殊字符或是保留字,则每次引用时都必须引用它。
...
标识符引号字符是反勾号(“ ``` "):
关键字和保留字的完整列表见第10.3节“关键字和保留字”。在该页中,后跟“(r)”的字是保留字。下面列出了一些保留字,包括许多可能导致此问题的保留字。
添加

之前
通过
呼叫
案例
条件
删除
描述
描述


在里面
指数
插入
间隔

钥匙
喜欢
限制
长的
比赛

选项

秩序
隔板
等级
参考文献
选择
table

更新
哪里

解决方案

你有两个选择。

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

最简单的解决方案就是避免使用保留字作为标识符。您可能可以为您的列找到另一个合理的名称,它不是保留字。
这样做有几个好处:
它消除了您或使用数据库的其他开发人员由于忘记或不知道某个特定标识符是保留字而意外编写语法错误的可能性。mysql中有很多保留字,大多数开发人员不太可能都知道。如果一开始不使用这些词,就可以避免给自己或未来的开发人员留下陷阱。
引用标识符的方法在sql方言之间是不同的。默认情况下,mysql使用反引号引用标识符,而符合ansi的sql(实际上,这里提到的是在ansisql模式下的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)

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

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

相关问题