在MySQL中选择一个也是关键字的列

6
由于某些原因,我现在工作的新公司的开发人员决定将他们的列命名为“ignore”和“exists”。现在当我在MySQL查询中使用这些单词作为where子句时,会出现语法错误;然而,我似乎无法找到如何引用这些列而不会遇到错误的方法。我尝试将它们设置为字符串,但那没有任何意义。
有什么帮助吗?
此外,这种不匹配是否有一个术语?

“Reserved words”或“keywords”是通常使用的术语。用于指称解决方案的术语通常被称为“引用”或更具体地说,“标识符引用”。 - Phil
2个回答

14

将名称用反引号括起来:

`ignore`, `exists`

如果您需要跨多个表或数据库工作,则需要分别转义数据库名称、表名称和字段名称(如果每个名称都与关键字匹配):

SELECT * FROM `db1`.`table1`
LEFT JOIN `db2`.`table2` on `db1`.`table1`.`field1`=`db2`.`table2`.`field2`

只有与关键字实际匹配的部分需要进行转义,所以例如:

select * from `db1`.table

也可以。


这种不匹配的情况有专门的术语吗? - randall123
@randall123 - 我能想到的最好术语可能是“保留字冲突”,但我不知道这是否是标准短语。 - Brad Mace

4
官方术语是“白痴” :-) 你可以在名称周围放置反引号,例如:
`ignore`

如果可能的话,我会认真考虑更改名称。反引号不是标准的SQL语法,而且我更喜欢列名更具表达性。例如,ignoreThisUserorderExists(我尝试遵循的一般规则是在其中有一个名词和一个动词)。

有趣的是,一些DBMS可以根据上下文推断出不要将其视为保留字。例如,DB2/z允许使用相当丑陋的写法:

> CREATE TABLE SELECT ( SELECT VARCHAR(10) );
> INSERT INTO SELECT VALUES ('HELLO');
> SELECT SELECT FROM SELECT;
SELECT
---------+---------+---------+--------
HELLO
DSNE610I NUMBER OF ROWS DISPLAYED IS 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接