德比数据库 - 约束

6
在Derby服务器中,您如何使用模式的系统表中的信息创建选择语句,以检索每个表的约束名称?
2个回答

8
相关手册是Derby参考手册。有许多版本可用:10.13是2017年4月的当前版本,但在2009年5月为10.3版本。请参考Derby Reference Manual获取更多信息。
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来获取约束类型。

还有一种方法可以了解约束类型吗? - Artem Barger
1
我猜我可以替你看看文档。Sysconstraints.Type是一个CHAR(1)字段,它有以下值之一:'U'(唯一),'P'(主键),'F'(外键)或'C'(检查)。然而,当给出文档指针时,通常最好去阅读文档。 - Jonathan Leffler
这个查询在Derby 10.13中不起作用,你必须在表名sysconstraints和sysconstraints前加上"sys."。例如:使用sys.sysconstraints代替sysconstraints。 - kiwicomb123
@kiwicomb123:感谢提供的信息。我已相应地更新了答案。 - Jonathan Leffler

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表中相应表的列号。

如果有人知道一种优雅的方法在此查询中提取它,请告诉我。我正在获取一个表的所有列的列表,并在解析描述符以获取数字后从中提取名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接