31.2. PostgreSQL 類型系統

資料類型可以分為基本類型,復合類型,域和偽類型。

31.2.1. 基本類型

基本類型是那些在 SQL 語言層次更低的級別上 實現的類型,比如 int4(通常是一種低級的語言, 比如 C):它們通常與那些常被認為是抽像資料類型的類型對應; PostgreSQL 對這些資料類型只能透過用戶提供的方法來操作, 並且對這些資料類型的特性的理解只限於用戶所描述的範圍. 基本類型進一步分成標量和數組類型。對於每種標量類型, 系統都會自動建立一個對應的數組類型,可以保存該標量類型 變長的數組。

31.2.2. 復合類型

復合類型,或者說行類型,是當用戶建立資料表時建立的. 我們也可以建立一個"獨立的",沒有關聯資料表的 復合類型。一種復合類型只是一個帶著相關字串名稱的基本類型的列資料表。 一個復合類型的數值是一行字串值或者一條字串值組成的記錄。 用戶可以從 SQL 查詢裡訪問組成字串。

31.2.3. 域

域是基於一種特定的基本類型的,從很多角度來看,它們也可以和對應 的基本類型交換。但是,一個域可以有約束,把它的有效值限制在它 的下層基本類型允許的有效值範圍的一個子集。

域可以用 SQL 命令 CREATE DOMAIN 建立。 它們的建立和使用不在本章討論。

31.2.4. 偽類型

系統裡有集中用於特殊目的的"偽類型"。偽類型不能出現在資料表 的字串類型中,也不能用做復合類型的屬性,但是它們可以用於聲明函數的參數和 結果類型。這樣就在類型系統裡提供了一個機制用於標識特殊類型的函數。 Table 8-20 列出了現有的偽類型。

31.2.5. 多態類型

兩種特別有趣的偽類型是 anyelementanyarray, 它們在一起稱作多態類型。任何用這些類型定義 的函數就叫做多態函數。一種多態函數可以在許多不同 的資料類型上操作,它們判斷具體類型的方法是在一次調用中,使用實際傳遞進來的資料類型 來判斷。

多態參數和結果是相互綁定,並且在分析查詢調用的函數時解析成特定的資料類型。 每個聲明成 anyelement 的位置(參數或者返回類型)都允許擁有 一個特定的實際資料類型,但是在任何給定的調用過程中,它們都必須同樣的類型。每個聲明為 anyarray 的位置 都可以是任何數組資料類型,但是,類似的,它們也不許都是同樣的類型。如果有些 位置聲明為 anyarray 而其它的位置聲明為 anyelement, 那麼在 anyarray 位置上的類型必須是元素類型與那些出現在 anyelement 位置上的同類型的數組。

因此,如果多於一個參數位置聲明為一個多態類型,其實際效果是只允許某些實際 參數類型的組合出現。比如,一個函數聲明為 equal(anyelement, anyelement) 將接受任何兩個輸入值,只要它們的資料類型相同。

如果一個函數的的返回值聲明為多態類型,那麼至少有一個參數位置也是多態的, 並且提供給參數的類型決定該詞調用實際返回的類型。比如,如果沒有數組下標 機制,那麼我們可以定義一個函數實現下標的函數,像 subscript(anyarray, integer) returns anyelement。 這個聲明約束實際上的第一個參數是一個數組類型,並且允許分析器從第一個參數的 實際類型裡推導出正確的返回類型。