【问题标题】:DB2 table's UNIQUE INDEX not showing in TABCONST and CONSTDEP tablesDB2 表的 UNIQUE INDEX 未显示在 TABCONST 和 CONSTDEP 表中
【发布时间】:2019-01-09 16:21:08
【问题描述】:

我正在尝试使用以下查询从 SYSCAT 表中查询某些用户表的唯一索引,该查询使用 4 个目录表(INDEXESINDEXCOLUSETABCONSTCONSTDEP)。我意识到INDEXESINDEXCOLUSE 表中都有所有索引,但TABCONSTCONSTDEP 表中缺少许多索引。

TABCONSTCONSTDEP 表中的数据丢失是否有任何原因?是否有一些程序可以刷新这些目录表中的数据?

SELECT
    T.TABSCHEMA AS TABLE_SCHEMA,
    T.TABNAME AS TABLE_NAME,
    CASE T.TYPE
        WHEN 'F' THEN 'Foreign Key'
        WHEN 'I' THEN 'Functional Dependency'
        WHEN 'K' THEN 'Check'
        WHEN 'P' THEN 'Primary Key'
        WHEN 'U' THEN 'Unique'
    END AS TYPE,
    I.INDSCHEMA AS INDEX_SCHEMA,
    I.INDNAME AS INDEX_NAME,
    U.COLNAME AS COLUMN_NAME,
    U.COLSEQ AS COLUMN_ORDINAL,
    CASE U.COLORDER
        WHEN 'A' THEN 'Ascending'
        WHEN 'D' THEN 'Descending'
        WHEN 'I' THEN 'Included (unordered)'
    END AS COLUMN_SORRING
FROM
    SYSCAT.TABCONST T
    INNER JOIN
    SYSCAT.CONSTDEP C
    ON T.CONSTNAME = C.CONSTNAME
    INNER JOIN
    SYSCAT.INDEXES I
    ON
        C.BSCHEMA = I.INDSCHEMA AND
        C.BNAME = I.INDNAME
    INNER JOIN
    SYSCAT.INDEXCOLUSE U
    ON
        I.INDSCHEMA = U.INDSCHEMA AND
        I.INDNAME = U.INDNAME
WHERE
    TRIM(UPPER(T.TABSCHEMA)) = 'MYSCHEMA' AND
    TRIM(UPPER(T.TABNAME)) = 'MYTABLE'AND
    C.BTYPE = 'I'
--INDICES ONLY
ORDER BY
    T.TABSCHEMA,
    T.TABNAME,
    I.INDSCHEMA,
    I.INDNAME
;

注意事项

已编辑问题的标题:忘了说这完全是关于 UNIQUE 索引而不仅仅是索引!

【问题讨论】:

  • 主表应该是syscat.indexes/indexcoluse,然后left join到syscat.tabconst/constdep。

标签: sql db2 database-metadata system-tables rapidsql


【解决方案1】:

当你直接创建索引时,它不是一个约束:

CREATE UNIQUE INDEX myindex on mytab(mycol)

但是,如果您创建或更改表并使用UNIQUE 声明单个或多个这样的列,则它是一个约束。

【讨论】:

  • 非常感谢,我只是假设唯一索引和约束总是可以互换的(仅出于实际原因),因此错误地期望在所有 4 个表中找到元数据。这个post 有有趣的项目。
猜你喜欢
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多