2009-05-10 11 views
5

Derbyサーバーでは、各表の制約名を取り出すために、スキーマのシステム表の情報を使用してselect文を作成する方法はありますか?Derby - 制約

答えて

6

関連マニュアルはDerby Reference Manualです。多くのバージョンが利用可能である:10.13は2017年4月に現在のだったが、ダービーの十分最近のバージョンは、システム・カタログ表ことを必要とするので、それはオリジナルの答え

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

2009年5月に10.3

ました(10.13はcommentkiwicomb123で引用されている)、あなたも表記を、JOIN、および使用明示的に使用するようにクエリを修正することができますsys.を前置されています

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

余分な列を追加できます(たとえば、c.type)。制約の種類を取得できます。

+0

制約タイプを知る方法もありますか? –

+1

私はあなたのためにRTFMできると思います。 Sysconstraints.Typeは、 'U'(ユニーク)、 'P'(プライマリ)、 'F'(外部キー)または 'C'(チェック)のいずれかの値を持つCHAR(1)フィールドです。しかし、ドキュメントへのポインタが与えられたときには、通常、ドキュメントを読んで読むのが賢明です。 –

+0

この問合せはDerby 10.13では機能しません。テーブル名sysconstraintsとsysconstraintsの前に "sys"を付ける必要があります。例:sysconstraintsではなくsys.sysconstraintsを使用します。 – kiwicomb123

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ように、各テーブルの列番号のリストが含まれている数字はためSYSCOLUMNSテーブルの列番号に対応する(2,1)

対応する表。

誰もがこのクエリでこれを抽出する優雅な方法を持っている場合、私は知りたいと思います。私は、別のクエリでテーブルのすべての列のリストを取得しており、数値を取得するためにディスクリプタを解析した後に名前を抽出しています。