2011-03-31 15 views
6

¿Hay alguna manera de listar TODAS las claves foráneas en una base de datos SQLite?Lista SQLite TODAS las claves foráneas en una base de datos

Parece que no están almacenados en sqlite_master y PRAGMA foreign_key_list('table') solo listas de uno en uno.

Como alternativa, ¿hay alguna manera de enumerar qué claves externas hacen referencia a una tabla?

Respuesta

13

Con el shell SQLite, use la instrucción .schema y use GREP para filtrar las líneas que contienen REFERENCES.

De shell.c en el repositorio de SQLite, la versión de hoy en el maletero, dos consultas:

SELECT sql 
    FROM (
     SELECT sql sql, type type, tbl_name tbl_name, name name 
      FROM sqlite_master 
     UNION ALL 
     SELECT sql, type, tbl_name, name 
      FROM sqlite_temp_master 
     ) 
WHERE tbl_name LIKE shellstatic() 
    AND type != 'meta' 
    AND sql NOTNULL 
ORDER BY substr(type, 2, 1), name 

y

SELECT sql 
    FROM (
     SELECT sql sql, type type, tbl_name tbl_name, name name 
      FROM sqlite_master 
     UNION ALL 
     SELECT sql, type, tbl_name, name 
      FROM sqlite_temp_master 
     ) 
WHERE type != 'meta' 
    AND sql NOTNULL 
    AND name NOT LIKE 'sqlite_%' 
ORDER BY substr(type, 2, 1), name 

El segundo es probablemente lo que usted está buscando.

+0

Hola gracias Benoit. Debería haber mencionado que haré esto en un cliente de Android, así que no tendré acceso al shell SQLite. :( –

+0

@Fergal Moran: respuesta actualizada – Benoit

+1

Hola Benoit: esto me da el ddl completo para todas las tablas, lo cual es útil pero me deja con el problema de analizar las cosas específicas de la clave foránea. Probablemente sería más fácil para para llamar a PRAGMA foreign_keys sobre los resultados de "SELECT tbl_name FROM sqlite_master WHERE type = 'table'" pero estoy tratando de encontrar una manera más fácil de obtener esto? –

Cuestiones relacionadas