Apache derby-SELECT * FROM表名不起作用

时间:2018-12-14 02:21:22

标签: sql apache derby

当我执行SELECT * FROM tablename时,会生成erorr: java.sql.SQLSyntaxErrorException:表/视图“表名”不存在。 但是如果我运行该sql命令 SELECT * FROM“ tablename” sql运行没有问题,为什么。

1 个答案:

答案 0 :(得分:1)

这是SQL标准的一个方面,称为“分隔标识符”。

表名称,列名称和其他对象是您可以在数据库中为其赋予名称的东西。

SQL标准指出,如果您对对象名称的大写/小写不特别了解,则可以仅指定名称而不使用引号,并且数据库将以不区分大小写的方式处理它们(通常,方法是将未加引号的对象名称转换为该名称的全大写形式。

CREATE TABLE mytable(c1 INT, c2 CHAR(10));

INSERT INTO MyTable (C1, C2) VALUES (42, 'Bryan');

SELECT c2 FROM MYTABLE;

由于您没有在引号中指定任何对象名称,因此所有这些示例都可以正常工作,因为mytableMyTableMYTABLE在不存在时都相同不能用引号引起来。

但是如果您用引号指定对象名称,那么您必须完全正确

CREATE TABLE "MyCaseSensitiveTable" (c1 int, c2 char(10));

INSERT INTO MyCaseInsensitiveTable (c1, c2) values (64, 'a nice age');

在这种情况下,您的INSERT语句将被拒绝,因为"MyCaseSensitiveTable"MyCaseSensitiveTable相比不同。

带分隔符的标识符还具有其他优点:

  1. 您可以使用SQL语言中保留的关键字作为表名,因此您可以根据需要创建名为"TABLE"的表。
  2. 您可以在数据库对象名称中使用各种特殊字符。

我个人不尝试使用定界标识符,因为我认为它们使我的程序难以阅读。但是它们是SQL标准的完全合法部分,并且得到了广泛使用。

但是,最重要的是:如果要将数据库对象名称用引号引起来,则必须始终将它们用引号引起来,并且必须给每次都完全相同,但是如果您不对数据库对象名使用引号,则会以不区分大小写的方式对待它们。