如何获取 derby 数据库中的外键列表
How do I get a list of the foreign keys in a derby database
我试图确保在我的 derby 数据库中创建了外键,第一步是检查外键是否存在并应用于正确的列。
我一直在检查系统 table,例如 sys.sysforeignkeys 和 sys.sysconstraints,但是当我通过各种方法追查从 table 到 table 的 ID 时sys* tables,我似乎无法弄清楚如何将 sys.sysforeignkeys 中的一行映射到列名中。
我必须执行什么 SQL 查询来检查是否已执行以下 ALTER TABLE?
ALTER TABLE ClipPoints ADD FOREIGN KEY(clipName) REFERENCES LABELS(label)
这需要是一个完全自动化的过程,无需用户干预。
使用字典视图:
以下是在 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'
您错过的 table 是 sys.sysconglomerates
table。它包含一个看起来像这样的 "descriptor":
DESCRIPTOR
----------
BTREE (1)
不幸的是,使用 SQL 将该描述符解码为列索引有点棘手,因此您可能需要求助于 Java 才能找到相关列。
使用JDBCDatabaseMetaData
对于 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"));
}
}
您也可以使用 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;
...
我试图确保在我的 derby 数据库中创建了外键,第一步是检查外键是否存在并应用于正确的列。
我一直在检查系统 table,例如 sys.sysforeignkeys 和 sys.sysconstraints,但是当我通过各种方法追查从 table 到 table 的 ID 时sys* tables,我似乎无法弄清楚如何将 sys.sysforeignkeys 中的一行映射到列名中。
我必须执行什么 SQL 查询来检查是否已执行以下 ALTER TABLE?
ALTER TABLE ClipPoints ADD FOREIGN KEY(clipName) REFERENCES LABELS(label)
这需要是一个完全自动化的过程,无需用户干预。
使用字典视图:
以下是在 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'
您错过的 table 是 sys.sysconglomerates
table。它包含一个看起来像这样的 "descriptor":
DESCRIPTOR
----------
BTREE (1)
不幸的是,使用 SQL 将该描述符解码为列索引有点棘手,因此您可能需要求助于 Java 才能找到相关列。
使用JDBCDatabaseMetaData
对于 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"));
}
}
您也可以使用 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;
...