34.16. columns

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

表 34-14. 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 如果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 如果data_type标识一个间隔类型,这个字段包含这个字段时间间隔声明, 例如,YEAR TO MONTH, DAY TO SECOND等等。 如果没有指定字段限制(也就是,间隔接受所有字段),或对于所有其他数据类型,这个字段是null。
interval_precisioncardinal_number 用于一个PostgreSQL不可用的特性 (参阅datetime_precision获取间隔类型字段的小数秒精度)
character_set_catalogsql_identifier用于PostgreSQL里一个不可用的特性
character_set_schemasql_identifier用于PostgreSQL里一个不可用的特性
character_set_namesql_identifier用于PostgreSQL里一个不可用的特性
collation_catalogsql_identifier 包含该字段的排序规则的数据库的名字(总是当前数据库),缺省或者字段的数据类型不可排序时为null。
collation_schemasql_identifier 包含该字段的排序规则的模式的名字,缺省或者字段的数据类型不可排序时为null。
collation_namesql_identifier 字段的排序规则的名字,缺省或者字段的数据类型不可排序时为null。
domain_catalogsql_identifier 如果字段是域类型,就是该域定义所在的数据库的名字(总是当前数据库),否则为null。
domain_schemasql_identifier 如果字段是域类型,就是域定义所在的模式的名字,否则为null。
domain_namesql_identifier如果字段是域类型,就是该域的名字,否则为null。
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)等等。