next up previous contents index
Next: Funciones incluidas en PostgreSQL Up: Algunas características de PostgreSQL Previous: Algunas características de PostgreSQL   Índice General   Índice de Materias


Tablas internas

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.


Tabla: Catálogo del sistema PostgreSQL. Cada base de datos tiene estas mismas tablas, salvo por la primera que es única, que almacenan cada una de las partes que componen la base de datos.
Nombre del catálogo Descripción
pg_database Bases de datos
pg_class Clases o tablas
pg_attribute Atributos o campos de la clase o tabla
pg_index Índices secundarios
pg_proc Procedimientos (en C y en SQL)
pg_type Tipos de datos (del sistema y definidos por el usuario)
pg_operator Operadores (del sistema y definidos por el usuario)
pg_aggregate Agregados y funciones agregadas
pg_am Métodos de acceso
pg_amop Operadores de métodos de acceso
pg_amproc Funciones de soporte para métodos de acceso
pg_opclass Clases de operadores de métodos de acceso



Tabla 9.2: Tabla que contiene todas las bases de datos que existen en el sistema. Vale la pena consultarla en aplicaciones que impliquen explorar diversos aspectos.
Table = pg_database
Field Type Length Description
datname name 32 Nombre de la base
datdba int4 4 Uid del dababase admin
datpath text var El path para llegar hasta la base



Tabla 9.3: Tabla que contiene todas las tablas en la base de datos actual.
Table = pg_class
Field Type Length Description
relname name 32 Nombre de la tabla
reltype oid 4 El Object Id de la tabla
relowner oid 4 El UID (postgres) del dueño de la tabla
relam oid 4  
relpages int4 4 Número de páginas ocupadas por la tabla
reltuples int4 4 Número de tuplas en la tabla
relhasindex bool 1 Verdadero si tiene al menos un índice
relisshared bool 1  
relkind char 1  
relnatts int2 2 Número de atributos
relchecks int2 2  
reltriggers int2 2 Número de triggers asociados
relhasrules bool 1 Verdadero si tiene reglas asociadas
relacl aclitem[] var  



Tabla 9.4: Tabla que contiene los atributos de los atributos de todas las tablas en la base actual.
Table = pg_attribute
Field Type Length Description
attrelid oid 4 OID del atributo
attname name 32 Nombre del atributo
atttypid oid 4 Oid del tipo definido para el atributo
attdisbursion float4 4  
attlen int2 2 Longitud en bytes del atributo
attnum int2 2  
attnelems int4 4  
attcacheoff int4 4  
atttypmod int2 2  
attbyval bool 1  
attisset bool 1  
attalign char 1  
attnotnull bool 1  
atthasdef bool 1  


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);


next up previous contents index
Next: Funciones incluidas en PostgreSQL Up: Algunas características de PostgreSQL Previous: Algunas características de PostgreSQL   Índice General   Índice de Materias
Ismael Olea 2001-04-21