2009-05-10 13 views
5

Wie können Sie im Derby-Server die Informationen in den Systemtabellen des Schemas verwenden, um eine SELECT-Anweisung zu erstellen, um die Abhängigkeitsnamen für jede Tabelle abzurufen?Derby - Einschränkungen

Antwort

6

Das entsprechende Handbuch ist die Derby Reference Manual. Es gibt viele Versionen verfügbar: 10.13 war Strom im April 2017, aber es war 10.3 im Mai 2009

Ursprüngliche Antwort

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

Seit ausreichend aktuelle Versionen von Derby verlangen, dass die Systemkatalogtabellen Präfix von sys. (10.13 von kiwicomb123 in einem comment zitiert wird), können Sie die Abfrage revidieren die explizite JOIN Notation zu verwenden, und die Verwendung:

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

Sie können zusätzliche Spalten hinzufügen, z. B. c.type, um den Abhängigkeitstyp zu erhalten.

+0

Gibt es auch eine Möglichkeit, den Constraint-Typ zu kennen? –

+1

Ich denke, ich kann RTFM für Sie. Sysconstraints.Type ist ein CHAR (1) Feld, das einen der Werte 'U' (Unique), 'P' (Primary), 'F' (Fremdschlüssel) oder 'C' (Check) hat. Wenn Sie jedoch Hinweise auf die Dokumentation geben, ist es normalerweise sinnvoll, die Dokumentation zu lesen. –

+0

Diese Abfrage funktioniert nicht in Derby 10.13. Sie müssen den Tabellennamen sysconstraints und sysconstraints den Präfix "sys." Zum Beispiel: Verwenden Sie sys.sysconstraints anstelle von 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  

die beiden Deskriptoreinträge enthalten eine Liste von Spaltennummern für jede Tabelle, wie

BTREE (2,1)

wobei die Zahlen auf die Spaltennummern in der Tabelle entsprechen syscolumns für die entsprechende Tabelle.

Wenn jemand eine elegante Möglichkeit hat, dies in dieser Abfrage zu extrahieren, würde ich gerne wissen. Ich erhalte eine Liste aller Spalten für eine Tabelle in einer separaten Abfrage und extrahiere die Namen daraus, nachdem ich die Deskriptoren analysiert habe, um die Zahlen zu erhalten.