Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中使用保留字作为表名或列名导致语法错误_Mysql_Reserved Words - Fatal编程技术网

在MySQL中使用保留字作为表名或列名导致语法错误

在MySQL中使用保留字作为表名或列名导致语法错误,mysql,reserved-words,Mysql,Reserved Words,我正在尝试执行一个简单的MySQL查询,如下所示: 插入用户详细信息(用户名、位置、密钥) 价值('Tim','Florida',42) 但我得到了以下错误: 错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解在第1行使用近'key)值('Tim','Florida',42)的正确语法 如何解决问题?问题 在MySQL中,SELECT、INSERT、DELETE等特定单词是保留字。因为它们有一个特殊的含义,所以每当您将它们用作表名、列名或其他类型的标

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

插入用户详细信息(用户名、位置、密钥)
价值('Tim','Florida',42)
但我得到了以下错误:

错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解在第1行使用近
'key)值('Tim','Florida',42)
的正确语法

如何解决问题?

问题 在MySQL中,
SELECT
INSERT
DELETE
等特定单词是保留字。因为它们有一个特殊的含义,所以每当您将它们用作表名、列名或其他类型的标识符时,MySQL都会将其视为一个语法错误,除非您将标识符用倒勾括起来

如正式文件中所述,在第节(增加重点)中:

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

如果标识符包含特殊字符或是保留字,则在引用时必须引用该标识符

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

在第节中可以找到关键字和保留字的完整列表。在该页中,后跟“(R)”的单词是保留单词。下面列出了一些保留字,包括许多可能导致此问题的保留字

  • 以前
  • 召唤
  • 案例
  • 状况
  • 删除
  • 描述
  • 描述
  • 团体
  • 索引
  • 插入
  • 间歇
  • 钥匙
  • 极限
  • 长的
  • 匹配
  • 不是
  • 选择权
  • 命令
  • 分割
  • 等级
  • 参考资料
  • 挑选
  • 桌子
  • 更新
  • 在哪里
解决方案 你有两个选择

1.不要使用保留字作为标识符 最简单的解决方案就是避免使用保留字作为标识符。您可能会为您的列找到另一个非保留字的合理名称

这样做有两个好处:

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

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

纯粹为了降低未来出错的风险,这通常比倒勾引用标识符更明智

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

演示用法的示例(摘自):


如果您已被重定向到此处,但未收到任何错误消息,则可能无法执行错误检查。请寻找关于如何为您的语言、库和/或工具执行此操作的建议不要每次出现问题都在这里发布。非常感谢。为什么只
MySQL
?这不是跨技术/语言的问题吗?这样的参考/规范性问题/答案不应该适用于任何标签吗?对于
SQLServer
,我们是否会有另一个类似的参考QA,因为反勾号在那里不适用;或者
C
或者
C#
或者
VB
,我们可能会得到一百个这样的参考QA?@abhitalks:因为每个实现都有不同的SQL风格,适用于MySQL的可能不一定适用于其他风格。如果相关社区认为有必要,可能会出现一个参考问题,否则我不会担心。在我看来,有十几个参考问题比有数千个重复问题要好。我在这里应用了wiki锁,因为它开始积累大量的答案,而这些答案没有添加任何内容。我认为,建议在这个问题的参考答案中使用begin和end而不使用backticks,这尤其有害。更好的做法是使用倒勾,句号,而不必知道哪个关键字是保留的或非保留的。@MarcAlff:
begin
end
不是保留字。上面的示例只是为了演示如何使用反勾号来解析错误消息。简单地说,不使用保留字比盲目地倒勾引用所有标识符(即使它们不需要)更好。我同意解决方案1更好,因为有人可以选择标识符名称。当名称无法更改时(如解决方案2中),必须调查哪些标识符是关键字,以及这些关键字是否保留(即使是将来的版本?),这是一个复杂的原因。顺便说一句,删除了-1,因为这个示例实际上来自于手册。MySQL中经常会创建新的保留字,并有新的版本。例如,MySQL 5.7中的非阻塞。系统地报价往往更能适应变化,并有助于升级。至于删除-1,我是乐观的。你是对的,我的删除失败是因为这个计时器。使用保留字作为标识符的另一个缺点是:它使搜索代码变得不可能。如果你能说出你的名字
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)";               ^   ^