列舉類型
在這個關於使用 Navicat Premium 17 在 PostgreSQL 中建立自訂資料類型的系列中,我們到目前為止已經探索了幾個選項。在 第 1 部分 中,我們學習了如何為免費 DVD 租賃資料庫 建立自訂網域。而上週,我們建立了一個複合類型來從使用者定義的函式傳回複雜的資料。今天的文章將介紹列舉類型(Enumerated Type),這類型限制值為一組預定義的選項。
ENUM 類型的概覽
列舉類型(ENUM)允許我們定義一個具有靜態、有序值集的資料類型。這在欄位必須包含一組預定義值中的一個時非常有用。
與其他 PostgreSQL 類型一樣,ENUM 類型是使用 CREATE TYPE 陳述式建立的。以下是定義四種使用者狀態的 ENUM 範例:
CREATE TYPE user_status AS ENUM ('active', 'inactive', 'suspended', 'pending');
以下是另一個定義電影評級的 ENUM 範例:
CREATE TYPE movie_rating AS ENUM ('G', 'PG', 'PG-13', 'R', 'NC-17');
當自訂類型定義完成後,我們可以在資料表中使用它,如下所示:
CREATE TABLE films ( film_id SERIAL PRIMARY KEY, title VARCHAR(255), rating movie_rating );
在 Navicat 17 中建立列舉類型
定義列舉類型的一種更簡單的方法是使用 Navicat 的 GUI 工具。你可以在 Navicat Premium 17 和 Navicat for PostgreSQL 17 中找到它們。若要存取「類型」工具,只需按一下主工具列中的「其他」按鈕,然後從下拉式清單中選取「類型」:
這會開啟「物件」窗格,在那裡我們可以看到現有類型的清單。若要建立新類型,請按一下「物件」工具列中「新增類型」項目旁的箭頭,然後從選單中選取「列舉」項目:
這會在新索引標籤中啟動類型設計器。在「一般」索引標籤上將有一個空白單元格,我們可以在其中輸入列舉的第一個標籤,即「G」:
我們可以按一下「新增標籤」來新增一行以輸入下一個標籤。輸入所有標籤後,「一般」索引標籤應該如下所示:
在按下「儲存」按鈕之前,我們可以按一下「SQL 預覽」標籤來查看 Navicat 產生的陳述式:
請注意,類型名稱為「未命名」,因為我們尚未儲存定義。這是正常的。
按下「儲存」按鈕後,我們會看到一個「另存為」對話方塊,我們可以在那裡輸入類型名稱「film_ rating」:
在資料表定義中使用 film_ rating 類型
現在我們可以像其他 PostgreSQL 資料類型一樣使用「film_ rating」類型。例如,我們可以將資料表欄位設定為我們的自訂類型。我們甚至可以變更現有資料表的類型,前提是其資料值符合我們的列舉值。事實上,將欄位的類型從通用 VARCHAR 變更為更嚴格的 ENUM 是一種快速確定欄位是否有無效值的有效方法。
如果我們在 Navicat 資料表設計器中開啟「film」資料表,我們可以將「rating」欄位設置為我們的「film_rating」類型,從「類型」下拉式清單中選取「(Type)」,然後將「物件類型」設定為「film_rating」:
同時確保「定序」欄位為空。
如果該欄位沒有任何無效值,我們應該能夠儲存資料表定義,而不會出現任何錯誤或警告。
將欄位類型設為 ENUM 的優點之一是 Navicat 將提供一個用於選擇值的下拉式清單:
總結
在今天的文章中,我們使用 Navicat Premium 17 的類型工具建立了一個列舉類型,並更新了現有資料表以利用我們的自訂類型來約束欄位值。在第 4 部分,我們將繼續討論範圍類型。