- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试执行一个简单的 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中,某些单词如SELECT
、INSERT
、DELETE
等是保留字。由于它们具有特殊含义,因此每当您将它们用作表名、列名或其他类型的标识符时,MySQL 都会将其视为语法错误 - 除非您用反引号将标识符括起来。
正如官方文档中所述,在10.2 Schema Object Names部分(强调):
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 Keywords and Reserved Words 部分找到。 。在该页面中,后面带有“(R)”的单词是保留字。下面列出了一些保留字,其中包括许多容易导致此问题的保留字。
您有两个选择。
最简单的解决方案就是避免使用保留字作为标识符。您也许可以为您的列找到另一个合理的名称,该名称不是保留字。
这样做有几个优点:
它消除了您或其他使用数据库的开发人员由于忘记或不知道特定标识符是保留字而意外编写语法错误的可能性。 MySQL 中有很多保留字,大多数开发人员不太可能知道所有这些保留字。通过首先不使用这些词,您可以避免给自己或 future 的开发人员留下陷阱。
SQL 方言之间引用标识符的方式有所不同。虽然 MySQL 默认使用反引号来引用标识符,但符合 ANSI 的 SQL(实际上是 ANSI SQL 模式下的 MySQL,如 here 所示)使用双引号来引用标识符。因此,用反引号引用标识符的查询不太容易移植到其他 SQL 方言。
纯粹是为了降低 future 发生错误的风险,这通常是比反引号引用标识符更明智的做法。
如果无法重命名表或列,请将有问题的标识符括在反引号 (`
) 中,如之前引用 10.2 Schema Object Names 中所述。 .
演示用法的示例(取自 10.3 Keywords and Reserved Words ):
mysql> <strong>CREATE TABLE interval (begin INT, end INT);</strong>
ERROR 1064 (42000): You have an error in your SQL syntax.
near 'interval (begin INT, end INT)'
mysql> <strong>CREATE TABLE `interval` (begin INT, end INT);</strong>
Query OK, 0 rows affected (0.01 sec)
同样,问题中的查询可以通过将关键字 key
用反引号括起来来修复,如下所示:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^
关于mysql - 由于在 MySQL 中使用保留字作为表名或列名而导致的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24020034/
这个问题已经有答案了: When to use single quotes, double quotes, and backticks in MySQL (13 个答案) 已关闭 3 年前。 我正在尝
我需要一个返回某些列值的选择查询。我想要的列以“U_S”开头。 Select * from em 我需要转换上面的查询。 '*' 必须是以下结果(但带有逗号): select COLUMN_NAME
在JPA中设置一对多关系时如何设置外键的列名? 我想将“items_id”的名称更改为“item_id” @OneToMany private List items; 我尝试了以下注释但没有成功: @
我有一个jqGrid列定义如下 name : 'idmycolumn', index : 'idmycolumn', width : 80,
我是否可以编写一个带参数的存储过程,即 mysql 查询,存储过程返回查询的列名? 例如我调用程序: 调用选择器('select * from users') 过程返回列名。使用 informatio
嗨,我刚刚开始学习 sql,我希望使用 concat 将列合并为一个列,但没能做到。我可以在没有 concat 的情况下运行代码,但是当我使用 concat 时,它会给我一个错误代码。谁能告诉我我做错
我们正在使用 java jdk 1.7.0_45,postgresql jdbc 连接器 postgresql-9.3-1100.jdbc41.jar。 这是我们问题的概要,下面粘贴了尽可能多的代码。
import pandas as pd import numpy as np rng = pd.date_range('1/1/2011', periods=6, freq='H') df = pd.
借助 PHP 的 mysqli 扩展,我可以使用 fetch_field() 方法通过 orgname 和 获取列和表的原始(无别名)名称结果中的 orgtable。 PDO 提供了方法getColu
我在 php 中使用 PDO,因此无法使用准备好的语句转义表名或列名。以下是我自己实现它的万无一失的方法吗: $tn = str_replace('`', '', $_REQUEST['tn']);
我想使用 apply 来跨越矩阵的行,并且我想在我的函数中使用当前行的行名。好像不能用rownames , colnames , dimnames或 names直接在函数内部。我知道我可以根据 thi
在编写管理数据的应用程序时,允许最终用户创建或删除最好表示为列的数据类别通常很有用。例如,我正在开发字典构建应用程序;用户可能会决定他们想要向数据添加“备用拼写”字段或其他内容,这可以很容易地表示为另
在我的数据框中,许多列名称以“.y”结尾,如示例所示: dat <- data.frame(x1=sample(c(0:1)), id=sample(10), av1.y = sample(10) ,
在 SQL Server 中,我希望看到 Table_Name 以及数据库中与该 Table_Name 关联的所有列。所以输出应该是这样的: TABLE_NAME COLUMN_N
在我的数据框中,许多列名称以“.y”结尾,如示例所示: dat <- data.frame(x1=sample(c(0:1)), id=sample(10), av1.y = sample(10) ,
在一种情况下,我们动态创建 sql 到 create动态临时表。 table_name 没有问题,因为它是由我们决定的,但是列名是由我们无法控制的来源提供的。 通常我们会使用以下查询检查列名: sel
我有一个数据框,我们可以通过代理 df = pd.DataFrame({'a':[1,0,0], 'b':[0,1,0], 'c':[1,0,0], 'd':[2,3,4]}) 还有一个类别系列 ca
我需要编写一个用户定义的函数,当应用于数据框时,它将返回列位置、列名称、模式和每个变量的类。我能够创建一个返回模式和类的,但是当我包含位置/名称时,我总是收到错误。我一直在这样做, myFunctio
我刚开始使用 QueryDSL 并遇到了问题。是否可以使用列名进行 orderBy?我为 orderBy 动态路径生成找到了这个: Generic querydsl orderBy dynamic p
操作 DataGridView 单元格时,您通常会执行以下操作: MyGrid.CurrentRow.Cells["EmployeeFirstName"].Value = "John"; 这一切都很好
我是一名优秀的程序员,十分优秀!