43.7. pg_attribute

pg_attribute 表 存储关于表的字段的信息。数据库里每个表的每个字段都在 pg_attribute 里有一行。 (还有用于索引和其它对象的属性元组,见 pg_class。)

术语 属性 等效于 列/字段,使用它是历史原因。

Table 43-7. pg_attribute 字段

名字类型引用描述
attrelidoidpg_class.oid此列/字段所属的表
attnamename 字段名字
atttypidoidpg_type.oid这个字段的数据类型
attstattargetint4  attstattarget 控制 ANALYZE 为这个字段积累的统计细节的级别. 零值表示不收集统计信息。负数表示使用系统缺省的统计对象。 正数值的确切信息是和数据类型相关的。 对于标量数据类型,attstattarget 既是要收集的"最常用数值"的目标数目,也是要创建的 柱状图的目标数量。
attlenint2  是本字段类型 pg_type.typlen 的拷贝。
attnumint2  字段数目。普通字段是从 1 开始计数的。系统字段, 比如 oid, 有(任意)正数。
attndimsint4  如果该字段是数组,那么是维数,否则是 0。 (目前,一个数组的维数并未强制,因此任何非零值都表示 "这是一个数组"。)
attcacheoffint4  在磁盘上总是 -1,但是如果装载入内存中的行描述器中, 它可能会被更新以缓冲在行中字段的偏移量。
atttypmodint4  atttypmod 元组在创建表的时候 提供的类型相关的数据(比如,一个 varchar 字段的最大长度)。 它传递给类型相关的输入和长度转换函数当做第三个参数。 其值对那些不需要 atttypmod 的类型而言通常为 -1。
attbyvalbool  通常是这个字段类型的 pg_type.typbyval 的拷贝。
attstoragechar  这个字段的类型的 pg_type.typstorage 的拷贝。对于可压缩的数据类型(TOAST),这个字段可以在字段创建之后改变, 以便于控制存储策略。
attissetbool  如果为真,这个字段是一个结果集。这种情况下,在该字段真正存储的是 在 pg_proc 表里的一条行的 OID。 pg_proc 那条元组包含定义这个结果集的查询字串。 - 也就是说,那条能够返回这个结果集的查询。 所以 atttypid (见上面) 指向这个查询返回的类型,但是这个字段的实际长度是一个 oid 的长度(尺存)。--- 至少理论如此。 不过这些东西现在可能已经相当残破了。
attalignchar  这个字段的类型的 pg_type.typalign 的拷贝
attnotnullbool  这代表一个非空约束。我们可以改变这个字段以打开或者关闭这个约束。
atthasdefbool  这个字段有一个缺省值,此时它对应 pg_attrdef 表里实际定义此值的记录。
attisdroppedbool  这个字段已经被删除了,不再有效。一个已经删除的字段物理上仍然存在表中, 但会被分析器忽略,因此不能再通过SQL访问。
attislocalbool  这个字段是局部定义在关系中的。请注意一个字段可以同时是局部定义 和继承的。
attinhcountint4  这个字段所拥有的直接祖先的个数。如果一个字段的祖先个数非零, 那么它就不能被删除或重命名。