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
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.
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.
Czy istnieje również sposób sprawdzenia typu ograniczenia? –
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. –
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