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) 等等。