在Derby服务器中,如何使用模式系统表中的信息创建select语句以检索每个表的约束名称?
答案 0 :(得分:6)
相关手册是Derby Reference Manual。有许多版本:2017年4月有10.13,但2009年5月为10.3。
原始答案
SELECT c.constraintname, t.tablename
FROM sysconstraints c, systables t
WHERE c.tableid = t.tableid;
由于Derby的最新版本要求系统目录表以sys.
为前缀(kiwicomb123中comment引用了10.13),您可以修改查询以使用显式JOIN表示法,并使用:
SELECT c.constraintname, t.tablename
FROM sys.sysconstraints c
JOIN sys.systables t
ON c.tableid = t.tableid;
您可以添加额外的列 - 例如,c.type
以获取约束类型。
答案 1 :(得分: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表中的列号。
如果有人在这个查询中有一个优雅的方法来解析这个,我想知道。我在单独的查询中获取表的所有列的列表,并在解析描述符之后从中提取名称以获取数字。