The pg_class catalog describes tables and all other objects that have columns or are otherwise similar to a table. This includes indexes (see also pg_index), sequences (see also pg_sequence), views, materialized views, composite types, and TOAST tables — collectively referred to as "relations." Not all columns are meaningful for every relation kind.
| Column | Type | Description |
|---|---|---|
oid | oid | Row identifier. |
relname | name | Name of the table, index, view, etc. |
relnamespace | oid (references pg_namespace.oid) | OID of the namespace that contains this relation. |
reltype | oid (references pg_type.oid) | OID of the data type corresponding to this table's row type, if any. Zero for indexes, sequences, and TOAST tables, which have no pg_type entry. |
reloftype | oid (references pg_type.oid) | For typed tables, the OID of the underlying composite type. Zero for all other relations. |
relowner | oid (references pg_authid.oid) | Owner of the relation. |
relam | oid (references pg_am.oid) | For tables and indexes, the access method used (heap, B-tree, hash, etc.). Zero for sequences and relations without storage, such as views. |
relfilenode | oid | Name of the on-disk file for this relation. Zero means this is a "mapped" relation whose disk file name is determined by low-level state. |
reltablespace | oid (references pg_tablespace.oid) | Tablespace in which this relation is stored. If zero, the database's default tablespace is implied. Not meaningful if the relation has no on-disk file. |
relpages | int4 | Size of the on-disk representation of this table in pages (of size BLCKSZ). This is only an estimate used by the planner, updated by VACUUM, ANALYZE, and a few DDL commands such as CREATE INDEX. |
reltuples | float4 | Number of live rows in the table. This is only an estimate used by the planner, updated by VACUUM, ANALYZE, and a few DDL commands such as CREATE INDEX. -1 indicates that the row count is unknown because the table has never been vacuumed or analyzed. |
relallvisible | int4 | Number of pages marked all-visible in the table's visibility map. This is only an estimate used by the planner, updated by VACUUM, ANALYZE, and a few DDL commands such as CREATE INDEX. |
reltoastrelid | oid (references pg_class.oid) | OID of the TOAST table associated with this table, or zero if none. The TOAST table stores large attributes out of line in a secondary table. |
relhasindex | bool | True if this is a table that has (or recently had) any indexes. |
relisshared | bool | True if this table is shared across all databases in the cluster. Only certain system catalogs (such as pg_database) are shared. |
relpersistence | char | p = permanent table, u = unlogged table, t = temporary table. |
relkind | char | r = ordinary table, i = index, S = sequence, t = TOAST table, v = view, m = materialized view, c = composite type, f = foreign table, p = partitioned table, I = partitioned index. |
relnatts | int2 | Number of user columns in the relation (system columns not counted). There must be this many corresponding entries in pg_attribute. |
relchecks | int2 | Number of CHECK constraints on the table. See pg_constraint. |
relhasrules | bool | True if the table has (or once had) rules. See pg_rewrite. |
relhastriggers | bool | True if the table has (or once had) triggers. See pg_trigger. |
relhassubclass | bool | True if the table or index has (or once had) any inheritance children. |
relrowsecurity | bool | True if the table has row-level security enabled. |
relforcerowsecurity | bool | True if row-level security (when enabled) also applies to the table owner. |
relispopulated | bool | True if the relation is populated. This is true for all relations other than some materialized views. |
relreplident | char | Columns used to form the replica identity for rows: d = default (primary key, if any), n = nothing, f = all columns, i = index with indisreplident set (same as nothing if that index has been dropped). |
relispartition | bool | True if the table or index is a partition. |
relrewrite | oid (references pg_class.oid) | During a DDL operation that requires a table rewrite, contains the OID of the original relation for new relations being written; otherwise zero. This state is only visible internally — this field should never contain anything other than zero for a user-visible relation. |
relfrozenxid | xid | All transaction IDs before this one have been replaced with a permanent ("frozen") transaction ID in this table. Used to track whether the table needs to be vacuumed to prevent transaction ID wraparound or to allow pg_xact to be shrunk. Zero (InvalidTransactionId) if the relation is not a table. |
relminmxid | xid | All multixact IDs before this one have been replaced by a transaction ID in this table. Used to track whether the table needs to be vacuumed to prevent multixact ID wraparound or to allow pg_multixact to be shrunk. Zero (InvalidMultiXactId) if the relation is not a table. |
relacl | aclitem[] | Access privileges. |
reloptions | text[] | Access-method-specific options, as "keyword=value" strings. |
relpartbound | pg_node_tree | If the table is a partition (see relispartition), the internal representation of the partition bound. |
Lazy boolean flags
Several boolean flags in pg_class are maintained lazily: they are guaranteed to be true when that is the correct state, but may not be reset to false immediately when the condition no longer holds. For example, relhasindex is set by CREATE INDEX but never cleared by DROP INDEX. Instead, VACUUM clears relhasindex if it finds the table has no indexes. This arrangement avoids race conditions and improves concurrency.