6

在 Derby 服务器中,如何使用模式的系统表中的信息来创建 select 语句,以便检索每个表的约束名称?

4

2 回答 2

8

相关手册是Derby 参考手册。有许多可用版本:10.13 是 2017 年 4 月的最新版本,但 10.3 是 2009 年 5 月的版本。

原始答案

SELECT c.constraintname, t.tablename
    FROM sysconstraints c, systables t
    WHERE c.tableid = t.tableid;

由于足够新的 Derby 版本要求系统目录表带有前缀sys.(10.13 被kiwicomb123注释中引用),因此您也可以修改查询以使用显式 JOIN 表示法,并使用:

SELECT c.constraintname, t.tablename
  FROM sys.sysconstraints c
  JOIN sys.systables t
    ON c.tableid = t.tableid;

您可以添加额外的列——例如,c.type获取约束类型。

于 2009-05-10T18:42:09.593 回答
2
SELECT sc.schemaname, co.constraintname, t.tablename, cg.descriptor, t2.tablename, cg2.descriptor, f.deleterule, f.updaterule
FROM sys.sysconstraints co
JOIN sys.sysschemas sc ON co.schemaid = sc.schemaid
JOIN sys.systables t ON co.tableid = t.tableid
JOIN sys.sysforeignkeys f ON co.constraintid = f.constraintid
JOIN sys.sysconglomerates cg ON f.conglomerateid = cg.conglomerateid
JOIN sys.sysconstraints co2 ON f.keyconstraintid = co2.constraintid
JOIN sys.systables t2 ON co2.tableid = t2.tableid
JOIN sys.syskeys k ON co2.constraintid = k.constraintid
JOIN sys.sysconglomerates cg2 ON k.conglomerateid = cg2.conglomerateid
WHERE co.type = 'F' 
    and sc.schemaname = current schema    

这两个描述符条目包含每个表的列号列表,例如

BTREE(2,1)

其中数字对应于相应表的 syscolumns 表中的列号。

如果有人有一种优雅的方式在这个查询中提取这个,我想知道。我在单独的查询中获取表的所有列的列表,并在解析描述符以获取数字后从中提取名称。

于 2010-01-21T02:30:28.297 回答