6

Derbyサーバーでは、スキーマのシステムテーブルの情報を使用して、各テーブルの制約名を取得するためのselectステートメントをどのように作成できますか?

4

2 に答える 2

8

関連するマニュアルは、ダービーリファレンスマニュアルです。利用可能なバージョンは多数あります。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によって引用されていますが付いている必要があるため、クエリを修正して明示的な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    

2つの記述子エントリには、次のような各テーブルの列番号のリストが含まれています。

BTREE(2,1)

ここで、番号は、対応するテーブルのsyscolumnsテーブルの列番号に対応しています。

誰かがこのクエリでこれを抽出するエレガントな方法を持っているなら、私は知りたいです。別のクエリでテーブルのすべての列のリストを取得し、記述子を解析して数値を取得した後、そこから名前を抽出しています。

于 2010-01-21T02:30:28.297 に答える