¿Hay alguna manera de usar SQL para enumerar todas las claves foráneas para una tabla dada? Sé el nombre / esquema de la tabla y puedo conectarlo.
sql
postgresql
smack0007
fuente
fuente
Respuestas:
Puede hacerlo a través de las tablas de información_esquema. Por ejemplo:
fuente
FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)
psql hace esto, y si comienzas psql con:
le mostrará exactamente qué consulta se ejecuta. En el caso de encontrar claves foráneas, es:
En este caso, 16485 es el oid de la tabla que estoy viendo, puede obtenerlo simplemente lanzando su nombre de tabla para volver a clasificar como:
Esquema: califique el nombre de la tabla si no es único (o el primero en su
search_path
):fuente
SELECT conname, pg_catalog.pg_get_constraintdef(r.oid, true) as condef FROM pg_catalog.pg_constraint r WHERE r.confrelid = 'myschema.mytable'::regclass;
psql -E -U username -d database ThenWHAT
?Emitir
\d+ tablename
en el indicador de PostgreSQL, además de mostrar los tipos de datos de la columna de la tabla, mostrará los índices y las claves externas.fuente
La respuesta de Ollyc es buena ya que no es específica de Postgres, sin embargo, se descompone cuando la clave externa hace referencia a más de una columna. La siguiente consulta funciona para un número arbitrario de columnas, pero depende en gran medida de las extensiones de Postgres:
fuente
Extensión a la receta ollyc:
Luego:
SELECT * FROM foreign_keys_view WHERE table_name='YourTableNameHere'
;fuente
revise la publicación ff para su solución y no olvide marcar esto cuando esté bien
http://errorbank.blogspot.com/2011/03/list-all-foreign-keys-references-for.html
fuente
Esta consulta funciona correctamente con claves compuestas también:
fuente
Creo que lo que estabas buscando y muy cerca de lo que escribió @ollyc es esto:
Esto enumerará todas las tablas que usan la tabla especificada como clave externa
fuente
voto corto pero dulce si funciona para ti.
fuente
Ninguna de las respuestas existentes me dio resultados en la forma en que realmente los quería. Así que aquí está mi consulta (gigantesca) para encontrar información sobre claves foráneas.
Algunas notas
from_cols
yto_cols
podrían simplificarse enormemente en Postgres 9.4 y posteriores usando enWITH ORDINALITY
lugar del hacker de uso de funciones de ventana que estoy usando.UNNEST
. No creo que lo haga, pero no tengo claves externas de varias columnas en mi conjunto de datos para probar. Agregar las sutilezas 9.4 elimina esta posibilidad por completo.ORDER BY
en funciones agregadas)STRING_AGG
conARRAY_AGG
si desea una matriz de columnas en lugar de una cadena separada por comas.-
fuente
De otra manera:
fuente
Puede usar los catálogos del sistema PostgreSQL . Tal vez pueda consultar pg_constraint para solicitar claves foráneas. También puede usar el esquema de información
fuente
Utilice el nombre de la clave primaria a la que hacen referencia las claves y consulte el esquema de información:
Aquí 'TABLE_NAME_pkey' es el nombre de la Clave primaria referenciada por las Claves externas.
fuente
Aquí hay una solución de Andreas Joseph Krogh de la lista de correo de PostgreSQL: http://www.postgresql.org/message-id/[email protected]
Esta solución maneja claves foráneas que hacen referencia a múltiples columnas y evita duplicados (que algunas de las otras respuestas no pueden hacer). Lo único que cambié fueron los nombres de las variables.
Aquí hay un ejemplo que devuelve todas las
employee
columnas que hacen referencia a lapermission
tabla:fuente
Para ampliar la excelente respuesta de Martin, aquí hay una consulta que le permite filtrar en función de la tabla principal y le muestra el nombre de la tabla secundaria con cada tabla principal para que pueda ver todas las tablas / columnas dependientes en función de las restricciones de clave externa en La mesa principal.
fuente
Solución adecuada al problema, utilizando
information_schema
, trabajando con claves de múltiples columnas, uniendo columnas de diferentes nombres en ambas tablas correctamente y también compatibles con ms sqlsever:Nota: Existen algunas diferencias entre las implementaciones de potgresql y sqlserver
information_schema
que hacen que la respuesta superior dé resultados diferentes en los dos sistemas: una muestra los nombres de columna para la tabla de clave externa y la otra para la tabla de clave primaria. Por esta razón, decidí usar la vista KEY_COLUMN_USAGE en su lugar.fuente
ORDINAL_POSITION
puede producir un resultado incorrecto cuando el orden de las columnas en la clave externa es diferente del orden de las columnas en la restricción única. Creo que debería haber acompañado enkcu_foreign.POSITION_IN_UNIQUE_CONSTRAINT = kcu_primary.ORDINAL_POSITION
Actualización : También, una clave externa puede depender de una restricción UNIQUE, así que creo que debería quitar elpks.CONSTRAINT_TYPE
estado y solo puede unirserc
akcu_primary
directamentefuente
Escribí una solución que me gusta y uso con frecuencia. El código está en http://code.google.com/p/pgutils/ . Vea la vista pgutils.foreign_keys.
Desafortunadamente, el resultado es demasiado extenso para incluirlo aquí. Sin embargo, puede probarlo en una versión pública de la base de datos aquí, así:
Esto funciona con 8.3 al menos. Anticipo actualizarlo, si es necesario, en los próximos meses.
-Reece
fuente
Creé una pequeña herramienta para consultar y luego comparar el esquema de la base de datos: volcar el esquema db de PostgreSQL en el texto
Hay información sobre FK, pero la respuesta ollyc brinda más detalles.
fuente
Nota: ¡No olvide el orden de las columnas mientras lee las columnas de restricción!
fuente
Esto es lo que estoy usando actualmente, enumerará una tabla y sus restricciones fkey [eliminar la cláusula de tabla y enumerará todas las tablas en el catálogo actual]:
fuente
la respuesta más rápida para verificar directamente en bash basada completamente en esta respuesta
fuente