PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

52.7. pg_attribute #

目录 pg_attribute 存储关于表列的信息。 数据库中每张表的每一列都恰好有一条 pg_attribute 行。(索引也有属性条目, 实际上,所有拥有 pg_class 条目的对象都有。)

术语属性(attribute)与列(column)同义,使用该术语是出于历史原因。

Table 52.7. \1 字段列说明

Column Type

Description

attrelid oid (references pg_class.oid)

本列所属的表

attname name

The column name

atttypid oid (references pg_type.oid)

该列的数据类型(对于被删除的列为零)

attlen int2

本列类型的 pg_type.typlen 的副本

attnum int2

列的编号。普通列从 1 开始向上编号。 系统列(如 ctid)具有(任意的)负数编号。

atttypmod int4

atttypmod 记录建表时提供的类型相关数据 (例如 varchar 列的最大长度)。 它会被传给类型相关的输入函数和长度强制转换函数。 对于不需要 atttypmod 的类型, 该值通常为 -1。

attndims int2

如果该列是数组类型,则为维数;否则为 0。 (目前并不强制数组的维数, 因此任何非零值实际上都表示“它是一个数组”。)

attbyval bool

本列类型的 pg_type.typbyval 的副本

attalign char

本列类型的 pg_type.typalign 的副本

attstorage char

通常是该列类型 pg_type.typstorage 的副本。 对于可 TOAST 的数据类型,可以在列创建之后更改它以控制存储策略。

attcompression char

该列当前的压缩方法。通常这是 '\0', 表示使用当前的默认设置 (见 default_toast_compression)。 否则,'p' 选择 pglz 压缩, 'l' 选择 LZ4 压缩。 不过,只要 attstorage 不允许压缩, 此字段就会被忽略。

attnotnull bool

本列具有一个(可能无效的)非空约束。

atthasdef bool

该列具有默认表达式或生成表达式,此时在 pg_attrdef 目录中会有一个真正定义该表达式的对应条目。 (检查 attgenerated 以确定它是默认表达式还是生成表达式。)

atthasmissing bool

该列有一个值,当该列完全从行中缺失时使用它, 这发生在行已创建之后又以非易变的 DEFAULT 值增加列时。实际使用的值存储在 attmissingval 列中。

attidentity char

如果是一个零字节(''), 则不是标识列。 否则,a 表示 always 生成, d 表示默认生成。

attgenerated char

如果是一个零字节(''),则不是生成列。 否则,s = 存储(stored), v = 虚拟(virtual)。 存储型生成列与普通列一样被物理存储。 虚拟生成列在物理上存储为空值,其实际值在运行时计算。

attisdropped bool

该列已被删除且不再有效。被删除的列在表中仍然物理存在, 但会被解析器忽略,因此无法通过 SQL 访问。

attislocal bool

该列是在此关系中本地定义的。注意,一列可以同时是本地定义并被继承的。

attinhcount int2

该列拥有的直接祖先的个数。祖先数非零的列不能被删除,也不能被重命名。

attcollation oid (references pg_collation.oid)

该列定义的排序规则;如果该列不是可排序数据类型,则为零

attstattarget int2

attstattarget 控制由 ANALYZE 为该列积累的统计信息的详细程度。 零值表示不应收集任何统计信息。 空值表示使用系统默认的统计目标。 正值的确切含义取决于数据类型。 对于标量数据类型,attstattarget 既是所要收集的“最常见值”的目标个数, 也是要创建的直方图桶的目标数量。

attacl aclitem[]

列级访问特权(如果在本列上专门授予了特权)

attoptions text[]

属性级选项,以 “keyword=value” 字符串的形式

attfdwoptions text[]

属性级的外部数据包装器选项,以 “keyword=value” 字符串的形式

attmissingval anyarray

该列拥有一个单元素数组,其中包含当该列完全从行中缺失时使用的值, 这发生在行已创建之后又以非易变的 DEFAULT 值增加该列时。只有当 atthasmissing 为真时才使用该值。如果没有值,则该列为空。


在被删除列的 pg_attribute 条目中, atttypid 会被重置为零, 但 attlen 以及从 pg_type 复制的其他字段仍然有效。这种安排是为了应对被删除列的数据类型 后来也被删除、因而不再有对应 pg_type 行的情况。 attlen 及其他字段仍可用于解释表的行内容。