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是否实际创建.
在线搜索我看到了两种可能的方法:
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)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###索引确实是在主键列上设置的主键和索引(虽然这基本上没有根据,但除此之外).
我的问题仍然是我需要找出我用特定名称声明的索引 - 并且该名称无处可寻.
的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)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |