Apache Derby为使用有意义的名称创建的索引提供了奇怪的名称

dan*_*anf 8 java sql database jdbc derby

我正在使用这个ddl在derby中创建一个简单的演示表:

CREATE TABLE MY_TABLE (
    SESSION_ID CHAR(36),
    ATTRIBUTE_NAME VARCHAR(200),
    CONSTRAINT MY_TABLE_PK PRIMARY KEY (SESSION_ID, ATTRIBUTE_NAME),
);
CREATE INDEX MY_TABLE_IX1 ON MY_TABLE (SESSION_ID);
Run Code Online (Sandbox Code Playgroud)

我想在测试中验证INDEX MY_TABLE_IX1是否实际创建.

在线搜索我看到了两种可能的方法:

  1. JDBC - >

    使用DatabaseMetaData我可以做一些事情

    metadata.getIndexInfo(null, "APP", "MY_TABLE", false, false)
    
    Run Code Online (Sandbox Code Playgroud)

    迭代结果集,直到我得到一行

    "MY_TABLE_IX1".equals(resultSet.getString("INDEX_NAME"))
    
    Run Code Online (Sandbox Code Playgroud)
  2. SQL - >

    SELECT c.CONGLOMERATENAME, t.TABLENAME FROM SYS.SYSCONGLOMERATES c 
    JOIN SYS.SYSTABLES t ON c.TABLEID = t.TABLEID 
    WHERE c.CONGLOMERATENAME = 'MY_TABLE_IX1' AND t.TABLENAME = 'MY_TABLE'
    
    Run Code Online (Sandbox Code Playgroud)

撇开显而易见的(比如我也应按列名称过滤,类似的东西),我遇到一个非常奇怪的行为:
Derby将我的一些索引保存为表单的字符串,SQL181215003216931使我无法按名称找到这些索引,而其他索引按我在ddl中指定的名称保存.

虽然我给出了一个小例子,但我的实际模式非常大,如果我运行以下内容:

SELECT c.CONGLOMERATENAME, t.TABLENAME FROM SYS.SYSCONGLOMERATES c 
JOIN SYS.SYSTABLES t ON c.TABLEID = t.TABLEID 
WHERE c.CONGLOMERATENAME LIKE '%SQL%'
Run Code Online (Sandbox Code Playgroud)

我得到了相同方式命名的索引的大量结果(它们在SQL部分之后的尾随数字不同),尽管我给它们中的每一个都有一个有意义的名称.

我试着在网上搜索有关这种行为的信息但是空洞了 - 有没有人知道我的神秘的答案?
似乎从SQL####类型名称到我最初给出的名称没有引用,所以如何根据我的名字找到我的索引?

以下是第二个SQL查询的示例输出:

CONGLOMERATENAME    TABLENAME
------------------------------------
SQL181215003159230  MY_TABLE
SQL181215003159240  SOME_OTHER_TABLE
SQL181215003216890  YET_ANOTHER_TABLE
Run Code Online (Sandbox Code Playgroud)

从JDBC执行:

TABLE_CAT|TABLE_SCHEMA|TABLE_NAME            |NON_UNIQUE|INDEX_QUALIFIER|INDEX_NAME        |TYPE|ORDINAL_POSITION|COLUMN_NAME|ASC_OR_DESC|CARDINALITY|PAGES|FILTER_CONDITION|
         |APP         |MY_TABLE              |false     |               |SQL181224003626061|3   |1               |SESSION_ID |A          |null       |null |null            |
         |APP         |SOME_OTHER_TABLE      |false     |               |SQL181215003159240|3   |1               |SESSION_ID |A          |null       |null |null            |
Run Code Online (Sandbox Code Playgroud)

---编辑----:根据@Noam在下面的答案,看来他是正确的,并且SQL###索引确实是在主键列上设置的主键和索引(虽然这基本上没有根据,但除此之外).

我的问题仍然是我需要找出我用特定名称声明的索引 - 并且该名称无处可寻.

Noa*_*oam 8

SQL*是直接在表定义配置的独特/主索引,像MY_TABLE_PK

根据他们的文档(https://db.apache.org/derby/docs/10.1/ref/rrefsqlj13590.html),您应该能够找到可以使用此查询的约束的索引(我对查询那里):

SELECT * FROM  SYS.SYSCONSTRAINTS t
JOIN SYS.SYSCONGLOMERATES c ON t.TABLEID = c.TABLEID 
WHERE CONSTRAINTNAME = 'MY_TABLE_PK';
Run Code Online (Sandbox Code Playgroud)