2009-05-10 18 views
5

Nel server Derby, come è possibile utilizzare le informazioni nelle tabelle di sistema dello schema per creare un'istruzione select per recuperare i nomi dei vincoli per ogni tabella?Derby - vincoli

risposta

6

Il manuale pertinente è Derby Reference Manual. Ci sono molte versioni disponibili: 10.13 era in corso nel mese di aprile 2017, ma era 10,3 nel maggio 2009.

risposta originale

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

Dal sufficientemente recenti versioni di Derby richiedono che le tabelle del catalogo di sistema sono preceduti da sys. (10.13 è citato da kiwicomb123 in un comment), è possibile rivedere la query per utilizzare l'esplicita JOIN notazione di troppo, e l'uso:

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

È possibile aggiungere colonne aggiuntive, ad esempio c.type per ottenere il tipo di vincolo.

+0

C'è anche modo di conoscere il tipo di vincolo? –

+1

Suppongo di poter RTFM per te. Sysconstraints.Type è un campo CHAR (1) che ha uno dei valori "U" (Unique), "P" (primario), "F" (chiave esterna) o "C" (controllo). Tuttavia, quando vengono forniti i puntatori alla documentazione, di solito è opportuno andare a leggere la documentazione. –

+0

Questa query non funziona in Derby 10.13, è necessario anteporre i nomi di tabella sysconstraints e sysconstraints con "sys.". Ad esempio: utilizzare sys.sysconstraints anziché 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  

le due voci descrittore contengono un elenco di numeri di colonna per ogni tabella, come

BTREE (2,1)

dove i numeri corrispondono ai numeri di colonna nella tabella syscolumns per la tabella corrispondente.

Se qualcuno ha un modo elegante di estrarre questo in questa query, mi piacerebbe sapere. Sto ottenendo un elenco di tutte le colonne per una tabella in una query separata ed estraendo i nomi da quello dopo aver analizzato i descrittori per ottenere i numeri.