信息模式由一组视图构成,它们包含定义在当前数据库中对象的信息。信息模式以 SQL 标准定义,因此能够被移植并且保持稳定 — 系统目录则不同,它们是与PostgreSQL相关的并且是为了实现的考虑而建模的。不过,信息模式视图不包含与PostgreSQL-相关特性有关的信息。要咨询那些信息你需要查询系统目录或其他PostgreSQL-相关视图。
注意:
当在数据库中查询约束信息时,一个期望返回一行的标准兼容的查询可能返回多行。这是因为 SQL 标准要求约束名在一个模式中唯一,但是PostgreSQL并不强制这种限制。PostgreSQL自动产生的约束名避免在相同的模式中重复,但是用户能够指定这种重复的名称。
这个问题可能在查询信息模式视图时出现,例如
check_constraint_routine_usage、check_constraints、domain_constraints和referential_constraints。一些其他视图也有相似的问题,但是它们包含了表名来帮助区分重复行,例如constraint_column_usage、constraint_table_usage、table_constraints。
一、模式
信息模式本身是一个名为information_schema的模式。这个模式自动存在于所有数据库中。这个模式的拥有者是集簇中的初始数据库用户,并且该用户自然地拥有这个模式上的所有特权,包括删除它的能力(但是这样节省的空间是很小的)。
默认情况下,信息模式不在模式搜索路径中,因此你需要使用限定名访问其中的所有对象。因为信息模式中的某些对象的名称是可能出现在用户应用中的一般名称,如果你想把该信息模式放在路径中,你应该小心。
二、数据类型
信息模式视图的列使用定义在信息模式中的特殊数据类型。它们被定义为普通内建类型之上的简单域。你不应在信息模式之外使用这些类型进行工作,但是如果你的应用从信息模式中进行选择,那你的应用就必须准备好面对它们。
这些类型是:
cardinal_number
一种非负整数。
character_data
一种字符串(没有指定最大长度)。
sql_identifier
一种字符串。这种类型被用于 SQL 标识符,类型character_data被用于任何其他类型的文本数据。
time_stamp
在类型timestamp with time zone之上的一个域。
yes_or_no
一种字符串域,它包含YES或NO。这被用来在信息模式中表示布尔(真/假)(信息模式是在类型boolean被加到 SQL 标准之前被发明的,因此这个惯例是用来使信息模式向后兼容)。
信息模式中的每一列都是这五种类型之一。
三、information_schema_catalog_name
information_schema_catalog_name是一个表,它总是包含一行和一列,其中包含了当前数据库(SQL 术语中的当前目录)的名字。
表 3.1. information_schema_catalog_name列
| 名称 | 数据类型 | 描述 |
|---|---|---|
catalog_name |
sql_identifier |
包含这个信息模式的数据库名 |
四、administrable_role_authorizations
视图administrable_role_authorizations标识当前用户对其有管理选项的所有角色。
表 3.2. administrable_role_authorizations列
| 名称 | 数据类型 | 描述 |
|---|---|---|
grantee |
sql_identifier |
被授予这个角色的成员关系的角色名(可以是当前用户,或者在嵌套角色成员关系情况下的一个不同角色) |
role_name |
sql_identifier |
角色名 |
is_grantable |
yes_or_no |
总是 YES |
五、applicable_roles
视图applicable_roles当前用户可以使用其特权的所有角色。这意味着有某种角色授权链从当前用户到讨论中的角色。当前用户本身也是一个可应用的角色。可应用的角色的集合通常被用于权限检查。
表 3.3. applicable_roles列
| 名称 | 数据类型 | 描述 |
|---|---|---|
grantee |
sql_identifier |
被授予这个角色的成员关系的角色名(可以是当前用户,或者在嵌套角色成员关系情况下的一个不同角色) |
role_name |
sql_identifier |
一个角色的名字 |
is_grantable |
yes_or_no |
YES表示被授予者在该角色上有管理选项,NO表示没有管理选项 |
六、attributes
视图attributes包含数据库中定义的组合数据类型的属性的有关信息(注意该视图并不给出有关表列的信息,表列有时候在 PostgreSQL 上下文环境中也被称为属性)。只有当前用户能够访问(由于是拥有者获得的权限或是在类型上有某些特权)的那些属性会被显示。
表 3.4. attributes列
| 名称 | 数据类型 | 描述 |
|---|---|---|
udt_catalog |
sql_identifier |
包含该数据类型的数据库名(总是当前数据库) |
udt_schema |
sql_identifier |
包含该数据类型的模式名 |
udt_name |
sql_identifier |
数据类型名 |
attribute_name |
sql_identifier |
属性名 |
ordinal_position |
cardinal_number |
属性在该数据类型内部的顺序位置(从 1 开始计算) |
attribute_default |
character_data |
该属性的默认表达式 |
is_nullable |
yes_or_no |
如果该属性是可能为空的,值为YES,否则为NO |
data_type |
character_data |
如果该属性是一个内建类型,此列值为该属性的数据类型;如果该属性是某种数组,此列值为ARRAY(在这种情况下,见视图element_types);其他情况,此列值为USER-DEFINED(在这种情况下,该类型在attribute_udt_name和相关列中标识)。 |
character_maximum_length |
cardinal_number |
如果data_type标识一个字符或位串类型,这里是声明的最大长度;如果没有声明最大长度,则对于所有其他数据类型为空。 |
character_octet_length |
cardinal_number |
如果data_type标识一个字符类型,这里是一个数据的最大可能长度(以字节计);对其他所有数据类型为空。最大字节长度取决于声明的字符最大长度(见上文)和服务器编码。 |
character_set_catalog |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
character_set_schema |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
character_set_name |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
collation_catalog |
sql_identifier |
包含此属性排序规则的数据库名(总是当前数据库),如果默认或者该属性的数据类型不可排序则为空 |
collation_schema |
sql_identifier |
包含此属性排序规则的模式名,如果默认或者该属性的数据类型不可排序则为空 |
collation_name |
sql_identifier |
该属性排序规则的名称,如果默认或者该属性的数据类型不可排序则为空 |
numeric_precision |
cardinal_number |
如果data_type标识一种数字类型,这列包含这个属性类型的(声明的或隐式的)精度。精度指示了有效位数。它可以按照列numeric_precision_radix中指定的被表示为十进制(基于 10)或二进制(基于 2)。对于所有其他数据类型,这一列为空。 |
numeric_precision_radix |
cardinal_number |
如果data_type标识一种数字类型,这一列指示numeric_precision和numeric_scale列中的值是基于什么来表示。该值为 2 或 10。对于所有其他数据类型,这一列为空。 |
numeric_scale |
cardinal_number |
如果data_type标识一种准确数字类型,这列包含这个属性类型的(声明的或隐式的)比例。比例指示了有效位数。它可以按照列numeric_precision_radix中指定的被表示为十进制(基于 10)或二进制(基于 2)。对于所有其他数据类型,这一列为空。 |
datetime_precision |
cardinal_number |
如果data_type标识一种日期、时间、时间戳或时间间隔类型,这一列包含这个属性类型的(声明的或隐式的)分数秒的精度,也就是秒值的小数点后的十进制位数。对于所有其他数据类型,这一列为空。 |
interval_type |
character_data |
如果data_type标识一种时间间隔类型,这一列包含时间间隔为这个属性包括哪些域的声明,例如YEAR TO MONTH、DAY TO SECOND等等。如果没有指定域限制(也就是该时间间隔接受所有域),并且对于所有其他数据类型,这个域为空。 |
interval_precision |
cardinal_number |
应用于一个PostgreSQL中不可用的特性(关于时间间隔类型属性的分数秒精度可见datetime_precision) |
attribute_udt_catalog |
sql_identifier |
属性数据类型被定义的数据库名(总是当前数据库) |
attribute_udt_schema |
sql_identifier |
属性数据类型被定义的模式名 |
attribute_udt_name |
sql_identifier |
属性数据类型的名称 |
scope_catalog |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
scope_schema |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
scope_name |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
maximum_cardinality |
cardinal_number |
总是空,因为数组在PostgreSQL中总是有无限制的最大势 |
dtd_identifier |
sql_identifier |
该列的数据类型描述符的一个标识符,在从属于该表的数据类型标识符之中唯一。这主要用于与这类标识符的其他实例进行连接(该标识符的指定格式没有被定义并且不保证在未来的版本中保持相同)。 |
is_derived_reference_attribute |
yes_or_no |
应用于一个PostgreSQL中不可用的特性 |
关于某些列的详情,参见第十六节之下的一个相似结构的视图。
七、character_sets
视图character_sets标识当前数据库中可用的字符集。因为 PostgreSQL 不支持在同一个数据库中有多个字符集,这个视图只显示一个字符集,它就是数据库编码。
注意下列术语在 SQL 标准中是怎样使用的:
字元集(character repertoire)
字符的一个抽象集合,例如UNICODE、UCS或LATIN1。它不作为一个 SQL 对象显示,但是在这个视图中可见。
字符编码形式(character encoding form)
某种字元集的一种编码。大部分较老的字元集只使用一种编码形式,并且因此它们没有独立的名字(例如LATIN1就是一种适用于LATIN1字元集的编码形式)。但是 Unicode 就有几种编码形式如UTF8、UTF16等等(并非全部被 PostgreSQL 支持)。编码形式不作为一个 SQL 对象显示,但是在这个视图中可见。
字符集(character set)
一个标识一种字元集、一种字符编码以及一种默认排序规则的命名 SQL 对象。一个预定义的字符集通常具有和一种编码形式相同的名字,但是用户可以定义其他名字。例如,字符集UTF8通常标识字元集UCS、编码形式UTF8以及某种默认排序规则。
你可以把 PostgreSQL 中的一种“编码”想成一个字符集或是一种字符编码形式。它们将具有相同的名字,并且在一个数据库中只能用其中一个。
表 3.5. character_sets列
| 名称 | 数据类型 | 描述 |
|---|---|---|
character_set_catalog |
sql_identifier |
当前字符集并未被实现为模式对象,因此这一列为空。 |
character_set_schema |
sql_identifier |
当前字符集并未被实现为模式对象,因此这一列为空。 |
character_set_name |
sql_identifier |
该字符集的名字,当前实现为显示该数据库编码的名字 |
character_repertoire |
sql_identifier |
字元集,如果编码为UTF8则显示UCS,否则只显示编码名称 |
form_of_use |
sql_identifier |
字符编码形式,与数据库编码相同 |
default_collate_catalog |
sql_identifier |
包含该默认排序规则的数据库名(如果任意排序规则被标识,总是当前数据库) |
default_collate_schema |
sql_identifier |
包含该默认排序规则的模式名 |
default_collate_name |
sql_identifier |
默认排序规则的名字。该默认排序规则被标识为匹配当前数据库的COLLATE和CTYPE设置的排序规则。如果没有那种排序规则,那么这一列和相关模式以及目录列为空。 |
八、check_constraint_routine_usage
视图check_constraint_routine_usage标识被检查约束琐事使用的例程(函数和过程)。只有被一个当前启用的角色所拥有的例程才被显示。
表 3.6. check_constraint_routine_usage列
| 名称 | 数据类型 | 描述 |
|---|---|---|
constraint_catalog |
sql_identifier |
包含该约束的数据库名(总是当前数据库) |
constraint_schema |
sql_identifier |
包含该约束的模式名 |
constraint_name |
sql_identifier |
约束名 |
specific_catalog |
sql_identifier |
包含该函数的数据库名(总是当前数据库) |
specific_schema |
sql_identifier |
包含该函数的模式名 |
specific_name |
sql_identifier |
该函数的“指定名称”。详见第四十节。 |
九、check_constraints
视图check_constraints包含所有检查约束,不管是定义在一个表上的还是定义在一个域上的,它们被一个当前启用的角色所拥有(表或域的拥有者就是约束的拥有者)。
表 3.7. check_constraints列
| 名称 | 数据类型 | 描述 |
|---|---|---|
constraint_catalog |
sql_identifier |
包含该约束的数据库名(总是当前数据库) |
constraint_schema |
sql_identifier |
包含该约束的模式名 |
constraint_name |
sql_identifier |
约束名 |
check_clause |
character_data |
该检查约束的检查表达式 |
十、collations
视图collations包含在当前数据库中可用的排序规则。
表 3.8. collations列
| 名称 | 数据类型 | 描述 |
|---|---|---|
collation_catalog |
sql_identifier |
包含该排序规则的数据库名(总是当前数据库) |
collation_schema |
sql_identifier |
包含该排序规则的模式名 |
collation_name |
sql_identifier |
默认排序规则的名称 |
pad_attribute |
character_data |
总是NO PAD(另一种选择PAD SPACE没有被 PostgreSQL 支持) |
十一、collation_character_set_applicability
视图collation_character_set_applicability标识可用的排序规则适用于哪些字符集。在 PostgreSQL 中,每个数据库中只有一种字符集(解释见第七节),因此这个视图没有提供很有用的信息。
表 3.9. collation_character_set_applicability列
| 名称 | 数据类型 | 描述 |
|---|---|---|
collation_catalog |
sql_identifier |
包含该排序规则的数据库名(总是当前数据库) |
collation_schema |
sql_identifier |
包含该排序规则的模式名 |
collation_name |
sql_identifier |
默认排序规则的名称 |
character_set_catalog |
sql_identifier |
当前字符集还未被实现为模式对象,所以这一列为空 |
character_set_schema |
sql_identifier |
当前字符集还未被实现为模式对象,所以这一列为空 |
character_set_name |
sql_identifier |
字符集名称 |
十二、column_domain_usage
视图column_domain_usage标识所有使用定义在当前数据库中并且被一个当前启用的角色拥有的域的列(表列或视图列)。
表 3.10. column_domain_usage列
| 名称 | 数据类型 | 描述 |
|---|---|---|
domain_catalog |
sql_identifier |
包含该域的数据库名(总是当前数据库) |
domain_schema |
sql_identifier |
包含该域的模式名 |
domain_name |
sql_identifier |
域名称 |
table_catalog |
sql_identifier |
包含该表的数据库名(总是当前数据库) |
table_schema |
sql_identifier |
包含该表的模式名 |
table_name |
sql_identifier |
表名称 |
column_name |
sql_identifier |
列名称 |
十三、column_options
视图column_options包含为当前数据库中外部表列定义的所有选项。只有当前用户能够访问(作为拥有者或具有某些特权)的那些外部表列才被显示。
表 3.11. column_options列
| 名称 | 数据类型 | 描述 |
|---|---|---|
table_catalog |
sql_identifier |
包含该外部表的数据库名(总是当前数据库) |
table_schema |
sql_identifier |
包含该外部表的模式名 |
table_name |
sql_identifier |
外部表名 |
column_name |
sql_identifier |
列名称 |
option_name |
sql_identifier |
一个选项名 |
option_value |
character_data |
该选项的值 |
十四、column_privileges
视图column_privileges标识所有授予给一个当前启用的角色或者被一个当前启用的角色授予的特权。对每一个列、授予者、被授予者的组合只有一行。
如果一个特权被授予在一整个表上,它在这个视图中被显示为在每一列上授予,但是只有可用于列粒度的特权类型才会这样: SELECT、INSERT、 UPDATE、REFERENCES。
表 3.12. column_privileges列
| 名称 | 数据类型 | 描述 |
|---|---|---|
grantor |
sql_identifier |
授予该特权的角色名 |
grantee |
sql_identifier |
被授予该特权的角色名 |
table_catalog |
sql_identifier |
包含该列的表所在的数据库名(总是当前数据库) |
table_schema |
sql_identifier |
包含该列的表所在的模式名 |
table_name |
sql_identifier |
包含该列的表名 |
column_name |
sql_identifier |
列名称 |
privilege_type |
character_data |
特权类型:SELECT、 INSERT、UPDATE或 REFERENCES |
is_grantable |
yes_or_no |
如果该特权是可授予的,则为YES,否则为NO |
十五、column_udt_usage
视图column_udt_usage标识所有使用被一个当前启用的角色拥有的数据类型的列。注意在PostgreSQL中,内建数据类型的行为和用户定义的类型相似,因此它们也被包括在这里。详见第十六节。
表 3.13. column_udt_usage列
| 名称 | 数据类型 | 描述 |
|---|---|---|
udt_catalog |
sql_identifier |
该列数据类型(如果适用,底层的域类型)被定义的数据库名(总是当前数据库) |
udt_schema |
sql_identifier |
该列数据类型(如果适用,底层的域类型)被定义的模式名 |
udt_name |
sql_identifier |
该列数据类型(如果适用,底层的域类型)的名称 |
table_catalog |
sql_identifier |
包含该表的数据库名(总是当前数据库) |
table_schema |
sql_identifier |
包含该表的模式名 |
table_name |
sql_identifier |
表名称 |
column_name |
sql_identifier |
列名称 |
十六、columns
视图columns包含数据库中有关所有表列(或视图列)的信息。系统列(oid等)不被包括在内。只有那些当前用户能够访问(作为拥有者或具有某些特权)的列才被显示。
表 3.14. columns列
| 名称 | 数据类型 | 描述 |
|---|---|---|
table_catalog |
sql_identifier |
包含该表的数据库名(总是当前数据库) |
table_schema |
sql_identifier |
包含该表的模式名 |
table_name |
sql_identifier |
表名称 |
column_name |
sql_identifier |
列名称 |
ordinal_position |
cardinal_number |
该列在表内的顺序位置(从 1 开始计) |
column_default |
character_data |
该列的默认表达式 |
is_nullable |
yes_or_no |
如果该列可以为空,则为YES,否则为NO。一个非空约束是让一列成为不能为空的方法,但还有其他方法。 |
data_type |
character_data |
如果该列的数据类型是一种内建类型,则为该列的数据类型;如果是某种数组(此种情况见视图element_types),则为ARRAY;否则为USER-DEFINED(此种情况下该类型被标识在udt_name和相关列中)。如果该列基于一个域,这一列引用该域底层的类型(该列被标识在domain_name和相关列中)。 |
character_maximum_length |
cardinal_number |
如果data_type标识一种字符或位串类型,这里是声明的最大长度;如果没有声明最大长度或者所有其他数据类型,这里为空。 |
character_octet_length |
cardinal_number |
如果data_type标识一个字符类型,这里是一个数据的最大可能长度(以字节计);对其他所有数据类型为空。最大字节长度取决于声明的字符最大长度(见上文)和服务器编码。 |
numeric_precision |
cardinal_number |
如果data_type标识一种数字类型,这列包含这个属性类型的(声明的或隐式的)精度。精度指示了有效位数。它可以按照列numeric_precision_radix中指定的被表示为十进制(基于 10)或二进制(基于 2)。对于所有其他数据类型,这一列为空。 |
numeric_precision_radix |
cardinal_number |
如果data_type标识一种数字类型,这一列指示numeric_precision和numeric_scale列中的值是基于什么来表示。该值为 2 或 10。对于所有其他数据类型,这一列为空。 |
numeric_scale |
cardinal_number |
如果data_type标识一种准确数字类型,这列包含这个属性类型的(声明的或隐式的)比例。比例指示了有效位数。它可以按照列numeric_precision_radix中指定的被表示为十进制(基于 10)或二进制(基于 2)。对于所有其他数据类型,这一列为空。 |
datetime_precision |
cardinal_number |
如果data_type标识一种日期、时间、时间戳或时间间隔类型,这一列包含这个属性类型的(声明的或隐式的)分数秒的精度,也就是秒值的小数点后的十进制位数。对于所有其他数据类型,这一列为空。 |
interval_type |
character_data |
如果data_type标识一种时间间隔类型,这一列包含时间间隔为这个属性包括哪些域的声明,例如YEAR TO MONTH、DAY TO SECOND等等。如果没有指定域限制(也就是该时间间隔接受所有域),并且对于所有其他数据类型,这个域为空。 |
interval_precision |
cardinal_number |
应用于一个PostgreSQL中不可用的特性(关于时间间隔类型属性的分数秒精度可见datetime_precision) |
character_set_catalog |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
character_set_schema |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
character_set_name |
sql_identifier |
应用于一个PostgreSQL中不可用的特性 |
collation_catalog |
sql_identifier |
包含此属性排序规则的数据库名(总是当前数据库),如果默认或者该属性的数据类型不可排序则为空 |
collation_schema |
sql_identifier |
包含此属性排序规则的模式名,如果默认或者该属性的数据类型不可排序则为空 |
collation_name |
sql_identifier |
该属性排序规则的名称,如果默认或者该属性的数据类型不可排序则为空 |
domain_catalog |
sql_identifier |
如果该列有一个域类型,这里是该域所在的数据库名(总是当前数据库),否则为空。 |
domain_schema |
sql_identifier |
如果该列有一个域类型,这里是该域所在的模式名,否则为空。 |
domain_name |
sql_identifier |
如果该列有一个域类型,这里是该域的名称,否则为空。 |
udt_catalog |
sql_identifier |
该列数据类型(如果适用,底层的域类型)被定义的数据库名(总是当前数据库) |
udt_schema |
sql_identifier |
该列数据类型(如果适用,底层的域类型)被定义的模式名 |
udt |

最低0.47元/天 解锁文章
930

被折叠的 条评论
为什么被折叠?



