如何获取derby数据库中的外键列表

时间:2015-11-02 21:42:00

标签: java jdbc derby

我正在尝试确保在我的derby数据库中创建了一个外键,第一步是检查外键是否存在并应用于正确的列。

我一直在研究像sys.sysforekeyskeys和sys.sysconstraints这样的系统表,但是当我通过各种sys *表从表到表追逐id时,我似乎无法弄清楚如何在sys中映射一行.sysforeignkeys到列名。

我必须执行哪些SQL查询来检查是否已执行以下ALTER TABLE?

ALTER TABLE ClipPoints ADD FOREIGN KEY(clipName) REFERENCES LABELS(label)

这需要是一个完全自动化的过程,无需用户干预。

2 个答案:

答案 0 :(得分:0)

使用字典视图:

以下是在Derby中查询外键的方法:

SELECT
  fc.constraintname,
  ft.tablename,
  fs.schemaname,
  fg.descriptor,
  pc.constraintname,
  ps.schemaname
FROM sys.sysconstraints fc
JOIN sys.sysforeignkeys f ON f.constraintid = fc.constraintid
JOIN sys.sysconglomerates fg ON fg.conglomerateid = f.conglomerateid
JOIN sys.systables ft ON ft.tableid = fg.tableid
JOIN sys.sysschemas fs ON ft.schemaid = fs.schemaid
JOIN sys.sysconstraints pc ON pc.constraintid = f.keyconstraintid
JOIN sys.sysschemas ps ON pc.schemaid = ps.schemaid
WHERE fc.type = 'F'

您缺少的表是sys.sysconglomerates表。它包含一个“描述符”,如下所示:

DESCRIPTOR
----------
BTREE (1)

不幸的是,使用SQL将该描述符解码为列索引有点棘手,因此您可能需要求助于Java才能找到相关的列。

使用JDBC DatabaseMetaData

对于Derby,使用JDBC标准DatabaseMetaData API可能更合理,它由Derby JDBC驱动程序实现:

try (ResultSet rs = connection.getMetaData().getImportedKeys(null, null, "CLIPPOINTS")) {

    while (rs.next()) {
         System.out.println(
             "  FK_NAME = " + rs.getString("FK_NAME")
           + ", FKTABLE_NAME = " + rs.getString("FKTABLE_NAME")
           + ", FKCOLUMN_NAME = " + rs.getString("FKCOLUMN_NAME"));
    }
}

答案 1 :(得分:0)

您也可以使用dblook转储架构,然后再查看架构的外键部分。

e.g。

-- FOREIGN
ALTER TABLE "LINE_ITEM" ADD CONSTRAINT "LINE_ITEM_SALE_ID_FK" FOREIGN KEY ("SALE_ID") 
REFERENCES "SALE" ("ID") ON DELETE RESTRICT ON UPDATE RESTRICT;
...