【发布时间】:2018-12-14 02:21:21
【问题描述】:
当我执行 SELECT * FROM tablename 时,会生成该错误: java.sql.SQLSyntaxErrorException:表/视图“表名”不存在。 但是如果我运行那个 sql 命令 SELECT * FROM "tablename" sql运行没有问题,为什么。
【问题讨论】:
当我执行 SELECT * FROM tablename 时,会生成该错误: java.sql.SQLSyntaxErrorException:表/视图“表名”不存在。 但是如果我运行那个 sql 命令 SELECT * FROM "tablename" sql运行没有问题,为什么。
【问题讨论】:
这是 SQL 标准的一个方面,称为“分隔标识符”。
表名、列名和其他对象是您可以在数据库中命名的东西。
SQL 标准规定,如果您不特别注意对象名称的大小写,您可以只指定不带引号的名称,您的数据库将以不区分大小写的方式处理它们(通常, 通过将不带引号的对象名称转换为该名称的全大写版本。
CREATE TABLE mytable(c1 INT, c2 CHAR(10));
INSERT INTO MyTable (C1, C2) VALUES (42, 'Bryan');
SELECT c2 FROM MYTABLE;
由于您没有在引号中指定任何对象名称,因此所有这些示例都可以正常工作,因为mytable、MyTable 和MYTABLE 在它们不在引号中时都是相同的。
但是,如果您在引号中指定对象名称,那么您必须完全正确:
CREATE TABLE "MyCaseSensitiveTable" (c1 int, c2 char(10));
INSERT INTO MyCaseInsensitiveTable (c1, c2) values (64, 'a nice age');
在这种情况下,您的INSERT 语句将被拒绝,因为"MyCaseSensitiveTable" 与MyCaseSensitiveTable不同。
分隔标识符带来其他优势:
"TABLE" 的表。就个人而言,我尽量不要使用分隔标识符,因为我认为它们会使我的程序难以阅读。但它们是 SQL 标准中完全合法的部分,并且被广泛使用。
但是,底线是:如果要将数据库对象名称放在引号中,则必须始终将它们放在引号中,并且必须给出名称完全相同每次都相同,但如果您的数据库对象名称不使用引号,则会以不区分大小写的方式处理它们。
【讨论】: