【问题标题】:How do I get a list of the foreign keys in a derby database如何获取 derby 数据库中的外键列表
【发布时间】:2016-02-02 22:04:18
【问题描述】:

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

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

我必须执行什么 SQL 查询来检查以下 ALTER TABLE 是否已经执行?

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

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

【问题讨论】:

  • SYSFOREIGNKEYS.CONGLOMERATEID 引用一个索引。我想你需要加入 SYSCONGLOMERATES
  • 这是我追逐的参考资料之一。 conglomerates 表有列 SCHEMAID TABLEID CONGLOMERATENUMBER CONGLOMERATENAME ISINDEX DESCRIPTOR ISCONSTRAINT CONGLOMERATEID 并且这些都没有将我引导到列名。
  • 既然你在使用Java,为什么不使用DatabaseMeta.getImportedKeys()
  • getImportedKeys() 似乎没有行。 getExportedKeys() 似乎显示了我需要的信息。
  • 我总是忘记这两种方法“指向”哪个方向;)

标签: java jdbc derby


【解决方案1】:

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

例如

-- 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;
...

【讨论】:

    【解决方案2】:

    使用字典视图:

    在 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 的情况下,使用由 Derby JDBC 驱动程序实现的 JDBC 标准 DatabaseMetaData API 可能更合理:

    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"));
        }
    }
    

    【讨论】:

    • javadoc 说它的 FKTABLE_NAME。 FK_NAME 是工作别名吗?
    • @MutantBob:我想我忘了加FKTABLE_NAME。但是您想查找外键本身,我认为 FK_NAME 会为您解决问题。查看all of the columns in the Javadoc
    猜你喜欢
    • 2014-06-27
    • 2019-05-05
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多