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
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.
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.
- 1. Derby con un'API RESTful
- 2. Derby/JavaDB vs SQLiteJDBC
- 3. Derby: equivalente CONCAT
- 4. Derby dialect for hibernate
- 5. Modifica password Derby DB
- 6. derby origini dati - connessione rifiutata
- 7. vincoli tipi: Passare più vincoli
- 8. Derby/Java DB incluso in Java 6?
- 9. Avvia automaticamente JavaDB (Derby) su GlassFish
- 10. Derby Apache - Verifica database già creato?
- 11. Gli INSERTS di Apache Derby sono lenti
- 12. quanta capacità ha il derby incorporato?
- 13. Confronto tra Derby vs PostgreSql Performance
- 14. nodeJS-Express o Meteor o Derby
- 15. Ometti lo schema nella query DERBY
- 16. Apache Derby - java.sql.SQLException: impossibile avviare il database
- 17. Vincoli generici sulla funzione
- 18. Scala Generics Tipo Vincoli
- 19. UILabel sizeToFit e vincoli
- 20. Uguaglianza sui vincoli
- 21. Grails vincoli predefiniti
- 22. GridSplitter con vincoli minimi
- 23. Vincoli UITableViewCellAccessoryCheckmark e AutoLayout
- 24. vincoli universalmente generalizzate
- 25. Disabilita temporaneamente i vincoli
- 26. Nested UIStackViews Vincoli interrotti
- 27. Vincoli non attendibili
- 28. Symfony2 Vincoli Override
- 29. Vincoli ID ElasticSearch
- 30. C# Vincoli generici multipli
C'è anche modo di conoscere il tipo di vincolo? –
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. –
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