30.9. columns

视图 columns 包含有关数据库中所有表字段(或者视图字段)的信息。 不包括系统字段(比如oid 等)。只有那些当前用户有权访问的字段才会显示出来(要么是所有者,要么是有些权限)。

Table 30-7. columns 字段

名字数据类型描述
table_catalogsql_identifier包含表的数据库的名字(总是当前数据库)
table_schemasql_identifier包含表的模式的名字
table_namesql_identifier表的名字
column_namesql_identifier字段的名字
ordinal_positioncardinal_number字段在表中的位置序号(从 1 开始)
column_defaultcharacter_data 字段的缺省表达式(如果当前用户不是包含该字段的表的所有者,则为空)
is_nullablecharacter_data 如果字段可能为空,则为 YES,如果知道它不能为空, 则为 NO。非空约束是我们得知字段不能为空的一个手段, 但是还可能有其它的。
data_typecharacter_data 果它是一个内置类型,那么为字段的数据类型,如果它是某种数组, 则为 ARRAY (在这种情况下,参阅视图 element_types),否则就是USER-DEFINED (这时,类型定义在 udt_name 和相关的字段上)。 如果字段基于域,这个字段引用域下层的类型(而域是在 domain_name 和相关字段里定义的)。
character_maximum_lengthcardinal_number 如果 data_type 标识一个字符或者位串类型, 那么就是声明的最大长度;如果是其它类型或者没有定义最大长度, 就是空。
character_octet_lengthcardinal_number 如果 data_type 标识一个字符类型,就是以字节记的最大可能长度 (这个应该不是 PostgreSQL 用户关心的东西);所有其它类型都是空。
numeric_precisioncardinal_number 如果 data_type 标识一个数值类型,这个字段包含(声明了或者蕴涵着)这个字段的数据类型的精度。 精度表示有效小数位的长度。它可以用十进制或者二进制来表示,这一点在 numeric_precision_radix 字段里声明。 对于其它数据类型,这个字段是空。
numeric_precision_radixcardinal_number 如果 data_type 标识一个数值类型,这个字段标识字段 numeric_precisionnumeric_scale 里的数据是多少进制的。值要么是 2 要么是 10。对于所有其它数据类型, 这个字段是空。
numeric_scalecardinal_number 如果 data_type 标识一个精确的数值类型, 那么这个字段包含(声明的或者隐含的)这个字段上这个类型的数量级。 数量级表明小数点右边的有效小数位的数目。它可以用十进制(10为基)或者二进制(二为基)来表示,正如 numeric_precision_radix 里声明的那样。对于所有其它数据类型,这个字段是空。
datetime_precisioncardinal_number 如果 data_type 标识一个日期,时间,或者内部类型,则是声明的精度。 如果是其它数据类型或者没有声明精度,就是null。
interval_typecharacter_data还没实现
interval_precisioncharacter_data还没实现
character_set_catalogsql_identifier用于一个PostgreSQL 里没有的特性
character_set_schemasql_identifier用于一个PostgreSQL 里没有的特性
character_set_namesql_identifier用于一个PostgreSQL 里没有的特性
collation_catalogsql_identifier用于一个PostgreSQL 里没有的特性
collation_schemasql_identifier用于一个PostgreSQL 里没有的特性
collation_namesql_identifier用于一个PostgreSQL 里没有的特性
domain_catalogsql_identifier 如果字段是域类型,就是该域定义所在的数据库名字(总是当前数据库), 否则为空。
domain_schemasql_identifier 如果字段是一个域类型,那么就是域所定义地模式的名字,否则为空。
domain_namesql_identifier如果字段是一个域类型,则是域的名字,否则为空
udt_catalogsql_identifier 这个字段数据类型(如果适用,就是下层的域的类型)定义所在的数据库的名字(总是当前数据库)。
udt_schemasql_identifier 这个字段数据类型(如果适用,就是下层的域的类型)定义所在的模式名字。
udt_namesql_identifier 这个字段数据类型(如果适用,就是下层的域的类型)的名字
scope_catalogsql_identifier用于一个PostgreSQL 里没有的特性
scope_schemasql_identifier用于一个PostgreSQL 里没有的特性
scope_namesql_identifier用于一个PostgreSQL 里没有的特性
maximum_cardinalitycardinal_number总是空,因为在PostgreSQL 里数组总是有无限的最大维数
dtd_identifiersql_identifier 一个该字段的数据类型描述符的标识符,在属于这个表中的所有的数据类型中唯一。 这个字段主要用于何其它这样的标识符实例连接。 (这个标识符的确切格式没有定义并且不保证在将来的版本中保持一样。)
is_self_referencingcharacter_data用于一个PostgreSQL 里没有的特性

因为数据类型在 SQL 里可以用多种方法定义,并且 PostgreSQL 包含额外的定义数据类型的方法,因此他们在信息模式里的表现形式可能不太一样。 字段 data_type 会被用于标识该字段下层的内置数据类型。 在 PostgreSQL 里,这意味着类型将定义在系统的系统表 pg_catalog 里。 如果应用可以很好地处理那些著名地内置类型(比如,对数值类型格式化成不同地东西, 或者使用在精度字段里的数据)。字段 udt_nameudt_schema, 和 udt_catalog 总是标识该字段的下层数据类型,即使字段是基于域的也一样。 (因为 PostgreSQL 把内置类型看作和用户定义类型一样,所以,内置类型也在这里出现。 这是对 SQL 标准的一个扩展。)如果一个应用想根据数据类型的不同而区别处理数据, 那么应该使用这些字段,因为在这种情况下它不会在意这个字段是否真正基于域的。 如果这个字段基于一个域,那么该域的标识保存在字段的 domain_namedomain_schema, 和 domain_catalog 里。 如果你想把字段和他们相关的数据类型凑成对儿,并且把域当作不同的类型 处理,你可以这么写 coalesce(domain_name, udt_name) 等等。