【问题标题】:Apache derby - SELECT * FROM tablename dont workApache derby - SELECT * FROM tablename 不起作用
【发布时间】:2018-12-14 02:21:21
【问题描述】:

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

【问题讨论】:

    标签: sql derby


    【解决方案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 标准中完全合法的部分,并且被广泛使用。

    但是,底线是:如果要将数据库对象名称放在引号中,则必须始终将它们放在引号中,并且必须给出名称完全相同每次都相同,但如果您的数据库对象名称不使用引号,则会以不区分大小写的方式处理它们。

    【讨论】:

    • 谢谢,您的回答非常清晰、有用且内容丰富。是的,当我创建我的表时,我使用了引号,所以这就是我得到那个错误的原因。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2013-10-16
    相关资源
    最近更新 更多