代码之家  ›  专栏  ›  技术社区  ›  Artem Barger

德比约束

  •  5
  • Artem Barger  · 技术社区  · 16 年前

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

    2 回复  |  直到 8 年前
        1
  •  6
  •   Community CDub    8 年前

    相关手册是 Derby Reference Manual . 有许多版本可用:10.13在2017年4月是当前版本,但在2009年5月是10.3。

    原始答案

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

    因为Derby的最新版本要求系统目录表前面加上前缀 sys. (10.13由 kiwicomb123 在一个 comment ,也可以修改查询以使用显式联接表示法,并使用:

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

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

        2
  •  2
  •   johnk    15 年前
    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    
    

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

    BTURE(2,1)

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

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