34.12. 字段

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

Table 34-10. columns 字段

名字数据类型描述
table_catalogsql_identifier包含表的数据库的名字(总是当前数据库)
table_schemasql_identifier包含表的模式的名字
table_namesql_identifier表名
column_namesql_identifier字段名
ordinal_positioncardinal_number字段在表中的位置序号(从 1 开始)
column_defaultcharacter_data字段的缺省表达式
is_nullableyes_or_no如果字段可能为空,则为YES,如果知道它不能为空,则为NO。 非空约束是我们得知字段不能为空的一个手段, 但是还可能有其它的。
data_typecharacter_data如果它是一个内置类型,那么为字段的数据类型,如果它是某种数组, 则为ARRAY(在这种情况下,参阅视图 element_types), 否则就是USER-DEFINED(这时,类型定义在udt_name 和相关的字段上)。 如果字段基于域,这个字段引用域下层的类型(而域是在domain_name和相关字段里定义的)。
character_maximum_lengthcardinal_number如果data_type标识一个字符或者位串类型,那么就是声明的最大长度; 如果是其它类型或者没有定义最大长度,就是空。
character_octet_lengthcardinal_number The maximum octet length depends on the declared character maximum length (see above) and the server encoding. 如果data_type标识一个字符类型,就是以字节记的最大可能长度 ;所有其它类型都是空。
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_referencingyes_or_no用于PostgreSQL里一个不可用的特性
is_identityyes_or_no用于PostgreSQL里一个不可用的特性
identity_generationcharacter_data用于PostgreSQL里一个不可用的特性
identity_startcharacter_data用于PostgreSQL里一个不可用的特性
identity_incrementcharacter_data用于PostgreSQL里一个不可用的特性
identity_maximumcharacter_data用于PostgreSQL里一个不可用的特性
identity_minimumcharacter_data用于PostgreSQL里一个不可用的特性
identity_cycleyes_or_no用于PostgreSQL里一个不可用的特性
is_generatedcharacter_data用于PostgreSQL里一个不可用的特性
generation_expressioncharacter_data用于PostgreSQL里一个不可用的特性
is_updatableyes_or_no如果字段为可更改则为YES,否则为NO (基表中的字段总是可以更新的,而试图中的列则不一定)

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