mysql 保留字作表名,由于在MySQL中使用保留字作为表或列名称而导致语法错误

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

INSERT INTO user_details (username, location, key)

VALUES ('Tim', 'Florida', 42)

但我得到了以下错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key) VALUES ('Tim', 'Florida', 42)' at line 1

我如何解决这个问题?

如果您已被重定向到此处,但没有收到任何错误消息,则可能无法进行错误检查。请寻找关于如何为您的语言、库和/或工具做这件事的建议,不要每次有事情不起作用时都在这里发布。谢谢您!

为什么只有MySQL?这不是跨技术/语言的问题吗?不管标签如何,这样的参考/规范性问题/答案不应该适用吗?对于SQLServer我们是否会有另一个类似的参考qa,因为backticks在这里不适用;或者C或C#或VB我们最终可能会得到100个这样的参考qa?

@Abhitalks:因为每个实现都有不同风格的SQL,而适用于MySQL的内容可能不一定适用于其他风格。如果相关社区认为有必要,参考问题可能会浮出水面,否则我不会担心。有十几个参考问题比有成千上万个重复的问题更重要。

我在这里应用了wiki锁,因为它开始产生很多不添加任何内容的答案。

问题

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

如官方文件中所述,在第10.2节中,模式对象名(增加了重点):

Certain objects within MySQL, including database, table, index, column, alias, view, stored procedure, partition, tablespace, and other object names are known as identifiers.

...

If an identifier contains special characters or is a reserved word, you must quote it whenever you refer to it.

...

The identifier quote character is the backtick ("`"):

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

添加

以前

通过

呼叫

案例

条件

删除

DESC

描述

索引

插入

间隔

钥匙

喜欢

极限

比赛

不是

选择权

秩序

分区

参考文献

选择

更新

哪里

解决方案

你有两个选择。1。不要使用保留字作为标识符

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

这样做有两个好处:

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

在SQL方言中引用标识符的方式不同。虽然MySQL默认情况下使用倒勾来引用标识符,但符合ANSI的SQL(实际上,在ansi-sql模式下,如本文所述)使用双引号来引用标识符。因此,使用反勾号引用标识符的查询不太容易移植到其他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)";               ^   ^

- 1。我认为建议在这个问题的参考答案中使用不带反勾号的"开始"和"结束"是特别邪恶的。一个更好的做法是使用backticks和period,而不必知道哪个关键字是保留的或非保留的。

@marcalff:begin和end不是保留字。上面的示例只是为了演示如何使用反勾号来解决错误消息。不使用保留字比盲目地在不需要的情况下反勾出所有标识符要好。

我同意解决方案1更好,因为有人可以实际选择标识符名称。当无法更改名称时,如解决方案2中所述,必须调查哪些标识符是关键字,以及这些关键字是否保留(即使是将来的版本?),是并发症的来源。顺便说一句,删除了-1,因为示例实际上来自手册。

@这就是为什么有两种解决方案。如果不能更改标识符名称,那么解决方案是用反勾号引用它。不过,我不明白为什么非保留字应该被引用。我想这只是个人喜好。

新的保留字经常在MySQL中创建,并有新的版本。例如,MySQL5.7中的非阻塞。系统地引用往往更能适应变化,并有助于升级。至于移除-1,我很乐观。你是对的,因为这个计时器,我的删除失败了。

双引号(")在MySQL中是否有效,如果是这样,它将是一个更好的选择,就像在SQL标准中一样。

我被关键词"条件"困住了。谢谢!

在SQL Server 2008中,它不适用于我。我用大括号代替了对我有用的。我希望它对某些人有帮助,以防万一

对于间隔,我们也可以使用"min"和"max"列名称。我用的是"从"和"到",但读了这篇文章后我改变了。谢谢你们。

插入到用户的详细信息(用户名、位置、key值中("tim","Florida",42)";

使用保留字作为标识符的另一个缺点是:它使搜索代码变得不可能。如果您将其中一个表命名为Table,那么搜索它将返回太多的误报。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值