En las tablas presentadas en esta sección mostramos el contenido de las tablas que PostgreSQL utiliza como catálogos para mantener el sistema. Es en base a la idea de mantener todo en tablas que PostgreSQL, a diferencia de otros manejadores de bases de datos, es extensible. La mayoría de la información presentada en esta sección ha sido extraída de examinar el código fuente de PostgreSQL y por esta razón se halla incompleta. Sin embargo, hemos procurado mostrar al menos la más importante para los desarrolladores.
|
|
Para saber que bases de datos hay en el sistema:
SELECT * FROM pg_database;
Para saber que tablas tengo en la base de datos actual:
SELECT * FROM pg_class;
Lo mismo, pero sólo las definidas por el usuario, excluyendo las del sistema:
SELECT * FROM pg_class WHERE relname !~~ 'pg%';
Si sólo queremos saber cuantos registros tiene una tabla, basta con preguntar:
SELECT relname,reltuples FROM pg_class WHERE relname=mitabla';
donde mitabla es el nombre de la tabla de la cual nos interesa saber el número de registros.
A continuación, presentamos una forma de extraer información de las
tablas de la base de datos. pg_database
tiene las bases de
datos, pg_class
tiene las tablas, y pg_attribute
tiene
los campos. Si lo que queremos saber es el número de registros en una
tabla determinada, basta con preguntar lo siguiente, conociendo la
tabla, adicionalmente se obtienen los campos. Para, además, saber los
tipos de los campos, habría que hacer un query a pg_type
con
los oids
de los campos. ¿Puede construir la consulta para
hacerlo?
SELECT relname,reltuples,attname,attnum FROM pg_class,pg_attribute WHERE pg_class.relname='mitabla' AND pg_attribute.attrelid=pg_class.oid AND attnum > 0 ORDER BY attnum;
Si lo que queremos es saber todo de todas las tablas de la base que no
sean del sistema, sino del usuario, por supuesto ordenadas por
oid
, se hace lo siguiente, pero con el problema de que incluye
los indices:
SELECT pg_class.oid,relname,reltuples,attname FROM pg_class,pg_attribute WHERE pg_class.relname !~~ '%pg%' AND pg_attribute.attrelid=pg_class.oid AND attnum > 0 ORDER BY pg_class.oid;
En el caso de que uno quiera saber cuales son los campos de todas las tablas que se tienen en una base de datos, esta consulta lo soluciona9.1.
SELECT pg_class.relname,pg_attribute.attname,pg_class.reltuples,pg_type.typname FROM pg_attribute WHERE attrelid = pg_class.oid AND attnum > 0 AND atttypid=pg_type.oid AND pg_class.oid IN (SELECT oid FROM pg_class WHERE relname !~~ 'pg%') AND pg_type.oid IN (SELECT oid FROM pg_type);