Skip to content

53.7.pg_attribute#

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

术语属性等同于列,出于历史原因而使用。

表 53.7.pg_attribute

列类型

描述

attrelid oid(引用 pg_class.oid

此列所属的表

attname name

列名

atttypid oid(引用 pg_type.oid

此列的数据类型(对于已删除的列为零)

attlen int2

此列类型的 pg_type.typlen 的副本

attnum int2

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

attcacheoff int4

在存储中始终为 -1,但当加载到内存中的行描述符中时,可能会更新此值以缓存行中属性的偏移量

atttypmod int4

atttypmod 记录在创建表时提供的特定于类型的 data(例如,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 = 始终生成,d = 默认生成。

attgenerated char

如果为零字节 (''),则不是生成列。否则,s = 存储。(将来可能会添加其他值。)

attisdropped bool

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

attislocal bool

此列在关系中本地定义。请注意,列可以同时在本地定义和继承。

attinhcount int2

此列的直接祖先数。祖先数不为零的列不能删除或重命名。

attstattarget int2

attstattarget 控制 ANALYZE 为此列累积的统计信息的详细级别。零值表示不应收集任何统计信息。负值表示使用系统默认统计信息目标。正值的具体含义取决于数据类型。对于标量数据类型,attstattarget 既是收集的 最常见值 的目标数,也是要创建的直方图分段数。

attcollation oid(引用 pg_collation.oid

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

attacl aclitem[]

列级访问权限(如果已专门对此列授予任何权限)

attoptions text[]

属性级选项,如 关键字=值 字符串

attfdwoptions text[]

属性级外部数据包装器选项,作为 关键字=值 字符串

attmissingval anyarray

此列有一个包含值的一维数组,当该列完全从行中丢失时使用该值,这种情况发生在创建行后使用非易失性 DEFAULT 值添加该列时。仅在 atthasmissing 为 true 时使用该值。如果没有值,则该列为 null。

在已删除列的pg_attribute条目中,atttypid重置为零,但从pg_type复制的attlen和其他字段仍然有效。需要此安排来应对已删除列的数据类型稍后被删除的情况,因此不再有pg_type行。attlen和其他字段可用于解释表中一行的内容。