網域(Domain)
以適當的格式儲存資料可以確保資料的完整性,防止錯誤,優化效能,並透過強制執行驗證規則和實現高效的資料管理來保持系統間的一致性。基於這些原因,像 PostgreSQL 這樣的頂級關聯式資料庫提供了多種資料類型。此外,PostgreSQL 透過「CREATE DOMAIN」和「CREATE TYPE」陳述式允許開發人員建立自訂資料類型,從而擴展資料類型以增強特定於應用程式的資料驗證、完整性和一致性。在今天的文章中,我們將學習如何使用 Navicat Premium 17 為免費 DVD 租賃資料庫 建立自訂網域。而第二部分將涵蓋類型。
CREATE DOMAIN 和 CREATE TYPE 的快速比較
儘管 CREATE DOMAIN 和 CREATE TYPE 這兩種陳述式都可用於建立使用者定義的資料類型,但有一些關鍵差異需要注意:
- CREATE DOMAIN 用於建立具有 NOT NULL、CHECK 等條件約束的使用者定義資料型別。
- CREATE TYPE 用於建立在預存程序中使用的複合類型作為傳回值的資料類型。
建立電子郵件網域
網域可讓你在多個資料表中定義可重複使用的驗證規則,將條件約束管理集中化,例如建立一個標準修件約束來防止特定欄位類型寫入 NULL 值並修剪空格。以下是為電子郵件地址建立網域並進行驗證檢查的範例:
CREATE DOMAIN email AS VARCHAR(255) CHECK ( VALUE ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$' ); -- Use in a table definition CREATE TABLE customer_contacts ( customer_id INT, contact_email email );
Navicat Premium 17 和 Navicat for PostgreSQL 17 均提供建立網域和類型的 GUI 工具,而無需理解所有確切的語法。你可以在主工具列的「其他」部份下找到它們。(兩個選單項目在下面以 紅色 標示):
網域工具包括四個索引標籤:一般、檢查、註解和 SQL 預覽。
一般屬性
所有網域都基於基礎類型。在本例中,它是 VARCHAR。一旦我們選擇了「Base Type」的基礎類型類別,我們就可以從兩個基礎類型下拉式清單中選取「pg_catalog」和「varchar」。我們還需要確保 VARCHAR 的長度為 255。以下是提供了所有相關資訊的「一般」索引標籤:
檢查
在下一個索引標籤中,我們可以定義一個或多個檢查,以在有人試圖將值指派值給我們的類型時執行。我們的檢查將根據 RegEx(正規運算式)測試該值:
SQL 預覽
此時,我們可以繼續儲存網域,這將執行產生的 CREATE DOMAIN 陳述式,或者我們可以一下「SQL 預覽」索引標籤,在儲存之前檢視陳述式:
請注意,網域名稱是「未命名」,因為我們尚未儲存定義。這是正常的。
在資料表中使用 email 網域
確認我們的「email」網域已建立的最佳方法是在資料表中嘗試使用它。「dvdrental」資料庫中的「staff」資料表有一個電子郵件欄位。目前,它將值儲存為 VARCHAR,而沒有任何驗證檢查。我們可以透過在資料表設計器的「類型」下拉式清單中選取「(Domain)」選項,然後選擇「public」和「email」作為「物件類型」,將類型變更為我們的網域:
一旦我們儲存資料表,嘗試變更(或新增)一個不是有效電子郵件地址的值將導致違反條件約束:
總結
藉由為免費的 dvdrental 資料庫建立自訂網域,我們看到了網域如何透過允許我們定義可重複使用的驗證規則來幫助集中條件約束管理。在第 2 部分中,我們將使用 Navicat Premium 17 類型工具建立自己的類型。