En el servidor de Derby, ¿cómo puede utilizar la información en las tablas del sistema del esquema para crear una instrucción de selección con el fin de recuperar los nombres de restricción para cada tabla?Derby: restricciones
Respuesta
El manual correspondiente es el Derby Reference Manual. Hay muchas versiones disponibles: 10.13 era corriente en abril de 2017, pero fue 10.3 en mayo de 2009.
Respuesta original
SELECT c.constraintname, t.tablename
FROM sysconstraints c, systables t
WHERE c.tableid = t.tableid;
Desde versiones recientes de Derby suficientemente requieren que las tablas de catálogo del sistema llevan el prefijo sys.
(10.13 es citado por kiwicomb123 en un comment), se puede revisar la consulta para utilizar la notación explícita JOIN también, y uso:
SELECT c.constraintname, t.tablename
FROM sys.sysconstraints c
JOIN sys.systables t
ON c.tableid = t.tableid;
Puede agregar columnas adicionales; por ejemplo, c.type
para obtener el tipo de restricción.
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
las dos entradas de descriptor contienen una lista de números de columna de cada tabla, como
BTREE (2,1)
donde los números corresponden a los números de las columnas en la tabla syscolumns para la tabla correspondiente.
Si alguien tiene una forma elegante de extraer esto en esta consulta, me gustaría saberlo. Obtengo una lista de todas las columnas de una tabla en una consulta separada y extraigo los nombres de eso después de analizar los descriptores para obtener los números.
- 1. Derby: CONCAT equivalente
- 2. mysql volcar en derby
- 3. Derby/JavaDB vs SQLiteJDBC
- 4. apache derby - explicar seleccionar
- 5. declaraciones condicionales en derby
- 6. Apache Derby INSERTOS son lentos
- 7. ¿Cuánta capacidad tiene Embby derby?
- 8. Java DB/Apache Derby con Android
- 9. Comparación de rendimiento de Derby vs PostgreSql
- 10. ¿Cómo usar SEQUENCE en Apache Derby?
- 11. Iniciar JavaDB (Derby) automáticamente en GlassFish
- 12. fuentes de datos derby - conexión rechazada
- 13. C++ restricciones plantilla
- 14. CSV restricciones primera célula
- 15. Igualdad en las restricciones
- 16. Optimización con restricciones
- 17. Grails restricciones predeterminadas
- 18. Desactivar restricciones temporalmente
- 19. C# Múltiples restricciones genéricas
- 20. Restricciones no de confianza
- 21. Restricciones de plantilla C++
- 22. GridSplitter con restricciones mínimas
- 23. MIPS restricciones de memoria?
- 24. Restricciones en la mezcla
- 25. Permutaciones con restricciones adicionales
- 26. Restricciones de carpeta Plone
- 27. C++, restricciones constructor
- 28. añadir restricciones en phpMyAdmin
- 29. Eliminando restricciones sin nombre
- 30. PostgreSQL - deshabilitar las restricciones
¿Hay alguna forma de conocer el tipo de restricción? –
Supongo que puedo RTFM para ti. Sysconstraints.Type es un campo CHAR (1) que tiene uno de los valores 'U' (Unique), 'P' (Primary), 'F' (Foreign key) o 'C' (Check). Sin embargo, cuando se le dan punteros a la documentación, por lo general es sensato ir y leer la documentación. –
Esta consulta no funciona en Derby 10.13, debe anteponer los nombres de tabla sysconstraints y sysconstraints con "sys.". Por ejemplo: use sys.sysconstraints en lugar de sysconstraints. – kiwicomb123