2009-05-10 15 views
5

W serwerze Derby, w jaki sposób można korzystać z informacji w tabelach systemowych schemat aby utworzyć SELECT w celu pobrania nazwy ograniczenie dla każdej tabeli?Derby - ograniczenia

Odpowiedz

6

Odpowiednią instrukcją jest Derby Reference Manual. Istnieje wiele wersje: 10.13 był obecny w kwietniu 2017 roku, ale było to 10,3 w maju 2009.

odpowiedź Original

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

Od wystarczająco najnowsze wersje Derby wymagają tabelach katalogu systemowego są poprzedzone sys. (10,13 cytowany przez kiwicomb123 w comment), można zmienić kwerendę aby użyć notacji zbyt wyraźne JOIN i zastosowanie:

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

Możesz dodać dodatkowe kolumny - na przykład c.type, aby uzyskać typ ograniczenia.

+0

Czy istnieje również sposób sprawdzenia typu ograniczenia? –

+1

Myślę, że mogę dla ciebie RTFM. Sysconstraints.Type to pole CHAR (1), które ma jedną z wartości "U" (unikatowe), "P" (pierwotne), "F" (klucz obcy) lub "C" (sprawdzenie). Jednak, gdy podaje się wskazówki do dokumentacji, zwykle rozsądnie jest przejść do przeczytania dokumentacji. –

+0

Ta kwerenda nie działa w Derby 10.13, należy poprzedzić nazwy tabel sysconstraints i sysconstraints słowem "sys.". Na przykład: użyj sys.sysconstraints zamiast 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  

dwa wpisy deskryptor zawiera listę numerów dla każdej kolumny tabeli, takie jak

btree (2,1)

gdzie numery odpowiadają numerom w kolumnie w tabeli SYSCOLUMNS dla odpowiednia tabela.

Jeśli ktoś ma elegancki sposób wydobycia tego w tym zapytaniu, chciałbym to wiedzieć. Otrzymuję listę wszystkich kolumn dla tabeli w osobnym zapytaniu i wyodrębnianie nazw z tego po przeanalizowaniu deskryptorów, aby uzyskać liczby.