Skip to content
← Catalog atlas / pg_attribute

SYSTEM CATALOG · System catalog

pg_attribute

The catalog pg_attribute stores information about table columns. There will be exactly one pg_attribute row for every column in every table in the database. (There will also be attribute entries for indexes, and indeed all objects that have pg_class entries.) The term attribute is equivalent to column and is used for historical reasons.

First seen PG 9.0Last seen PG 19Columns 25

Checked column by column against a PostgreSQL 18.6 instance · Raw measurement record ↗

Columns PostgreSQL 18

pg_attribute
COLUMNTYPEDESCRIPTION
attrelid oidNOT NULL The table this column belongs toReferences:pg_class.oid
attname nameNOT NULL The column name
atttypid oidNOT NULL The data type of this column (zero for a dropped column)References:pg_type.oid
attlen smallintNOT NULLDocumented as:int2 A copy of pg_type.typlen of this column's type
attnum smallintNOT NULLDocumented as:int2 The number of the column. Ordinary columns are numbered from 1 up. System columns, such as ctid, have (arbitrary) negative numbers.
atttypmod integerNOT NULLDocumented as:int4 atttypmod records type-specific data supplied at table creation time (for example, the maximum length of a varchar column). It is passed to type-specific input functions and length coercion functions. The value will generally be -1 for types that do not need atttypmod.
attndims smallintNOT NULLDocumented as:int2 Number of dimensions, if the column is an array type; otherwise 0. (Presently, the number of dimensions of an array is not enforced, so any nonzero value effectively means “it's an array”.)
attbyval booleanNOT NULLDocumented as:bool A copy of pg_type.typbyval of this column's type
attalign "char"NOT NULLDocumented as:char A copy of pg_type.typalign of this column's type
attstorage "char"NOT NULLDocumented as:char Normally a copy of pg_type.typstorage of this column's type. For TOAST-able data types, this can be altered after column creation to control storage policy.
attcompression "char"NOT NULLDocumented as:char The current compression method of the column. Typically this is '\0' to specify use of the current default setting (see default_toast_compression). Otherwise, 'p' selects pglz compression, while 'l' selects LZ4 compression. However, this field is ignored whenever attstorage does not allow compression.
attnotnull booleanNOT NULLDocumented as:bool This column has a (possibly invalid) not-null constraint.
atthasdef booleanNOT NULLDocumented as:bool This column has a default expression or generation expression, in which case there will be a corresponding entry in the pg_attrdef catalog that actually defines the expression. (Check attgenerated to determine whether this is a default or a generation expression.)
atthasmissing booleanNOT NULLDocumented as:bool This column has a value which is used where the column is entirely missing from the row, as happens when a column is added with a non-volatile DEFAULT value after the row is created. The actual value used is stored in the attmissingval column.
attidentity "char"NOT NULLDocumented as:char If a zero byte (''), then not an identity column. Otherwise, a = generated always, d = generated by default.
attgenerated "char"NOT NULLDocumented as:char If a zero byte (''), then not a generated column. Otherwise, s = stored, v = virtual. A stored generated column is physically stored like a normal column. A virtual generated column is physically stored as a null value, with the actual value being computed at run time.
attisdropped booleanNOT NULLDocumented as:bool This column has been dropped and is no longer valid. A dropped column is still physically present in the table, but is ignored by the parser and so cannot be accessed via SQL.
attislocal booleanNOT NULLDocumented as:bool This column is defined locally in the relation. Note that a column can be locally defined and inherited simultaneously.
attinhcount smallintNOT NULLDocumented as:int2 The number of direct ancestors this column has. A column with a nonzero number of ancestors cannot be dropped nor renamed.
attcollation oidNOT NULL The defined collation of the column, or zero if the column is not of a collatable data typeReferences:pg_collation.oid
attstattarget smallintDocumented as:int2 attstattarget controls the level of detail of statistics accumulated for this column by ANALYZE. A zero value indicates that no statistics should be collected. A null value says to use the system default statistics target. The exact meaning of positive values is data type-dependent. For scalar data types, attstattarget is both the target number of “most common values” to collect, and the target number of histogram bins to create.
attacl aclitem[] Column-level access privileges, if any have been granted specifically on this column
attoptions text[] Attribute-level options, as “keyword=value” strings
attfdwoptions text[] Attribute-level foreign data wrapper options, as “keyword=value” strings
attmissingval anyarray This column has a one element array containing the value used when the column is entirely missing from the row, as happens when the column is added with a non-volatile DEFAULT value after the row is created. The value is only used when atthasmissing is true. If there is no value the column is null.

Columns marked "implicit" are not included in SELECT *; some early statistics views are completed from same-version source, and the extra provenance is shown in the column description.

Common system columns 6

System attributes PostgreSQL provides, normally not expanded by SELECT *. Kept separately so they are not mixed in with ordinary columns.

ColumnsTypeattnum
tableoidoid-6
cmaxcid-5
xmaxxid-4
cmincid-3
xminxid-2
ctidtid-1

Column evolution matrix

Hover a cell for the column type
PresentAdded / type or attribute changeRemoved
COLUMN9.09.19.29.39.49.59.610111213141516171819
attrelid
attname
atttypid
attstattarget
attlen
attnum
attndims
attcacheoff
atttypmod
attbyval
attstorage
attalign
attnotnull
atthasdef
attisdropped
attislocal
attinhcount
attacl
attoptions
attcollation
attfdwoptions
attidentity
atthasmissing
attmissingval
attgenerated
attcompression

9.0 is the coverage baseline; a column already present in the baseline is not marked as added. The matrix aligns columns by name, so a rename appears as the old column removed and a new column added.

Evolution timeline

Changes between adjacent majors

PostgreSQL 18 ← 17

− attcacheoff2 column description updates

PostgreSQL 17 ← 16

~ attstattarget: not_null: true → false↕ Column order changed1 column description updates

PostgreSQL 16 ← 15

~ attinhcount: integer → smallint~ attndims: integer → smallint~ attstattarget: integer → smallint↕ Column order changed

PostgreSQL 14 ← 13

+ attcompression↕ Column order changed2 column description updates

PostgreSQL 12 ← 11

+ attgenerated2 column description updates

PostgreSQL 11 ← 10

+ atthasmissing+ attmissingval

PostgreSQL 10 ← 9.6

+ attidentity4 column description updates

PostgreSQL 9.5 ← 9.4

1 column description updates

PostgreSQL 9.2 ← 9.1

+ attfdwoptions

PostgreSQL 9.1 ← 9.0

+ attcollation

Compare any two versions

Pick two versions to see added, removed, and retyped columns. The interactive comparison needs JavaScript; the evolution timeline reads fine without it.