2009-05-10 27 views
5

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

6

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.

+0

¿Hay alguna forma de conocer el tipo de restricción? –

+1

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. –

+0

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

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  

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.