CREATE DOMAIN

Name

CREATE DOMAIN -- 定義一個新域

Synopsis

CREATE DOMAIN name [AS] data_type
    [ DEFAULT default_expr ]
    [ constraint [ ... ] ]

這裡 constraint 是︰

[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expression)}

描述

CREATE DOMAIN 建立一個新的資料域。 定義域的用戶成為其所有者。

如果給出一個模式名稱(比如,CREATE DOMAIN myschema.mydomain ...), 那麼該域是在指定的模式中建立的。否則它會在目前模式中建立。 域名字必需在其所在模式中的現有類型和域中唯一。

域可以便於我們把不同資料表之間的公共域抽取到一個位置進行維護。 比如,一個電子郵件地址字串可能在多個資料表中使用,所有的都是同樣的屬性。 我們可以定義並使用一個域,而不是分別設置每個資料表的約束。

參數

domainname

要建立的域名字(可以有模式修飾)。

data_type

域的下層資料類型。它可以包含數組聲明字。

DEFAULT default_expr

DEFAULT 子句為域資料類型的字串聲明一個預設值。 該值是任何不含變量的資料表達式(但不允許子查詢)。 預設資料表達式的資料類型必需匹配域的資料類型。如果沒有聲明預設值, 那麼預設值就是空值。

預設資料表達式將用在任何不為該字串聲明數值的插入操作。 如果為特定的字串聲明了預設值,那麼它覆蓋任何和該域相關聯的預設值。 然後,域的預設覆蓋任何與下層資料類型相關的預設。

CONSTRAINT constraint_name

一個約束的可選名稱。如果沒有聲明,系統生成一個名字。

NOT NULL

這個域的數值不允許為 NULL。

NULL

這個域的數值允許為空。它是預設。

這個子句只是用於和非標準的 SQL 資料庫兼容用。 我們不建議在新的應用中使用它。

CHECK (expression)

CHECK 子句聲明完整性約束或者是測試,域地數值必須滿足這些要求。 每個約束必須是一個生成一個布爾結果的資料表達式。它應該使用名字 VALUE 來引用被測試的數值。

目前,CHECK 資料表達式不能包含子查詢,也不能引用除 VALUE 之外的變量。

例子

這個例子建立了 us_postal_code 資料類型並且在一個資料表定義中使用了該類型。 我們使用了一個正則資料表達式測試以保證這些數值看起來像一個美國的郵政編碼。

CREATE DOMAIN us_postal_code AS TEXT
CHECK(
   VALUE ~ '^\d{5}$'
OR VALUE ~ '^\d{5}-\d{4}$'
);

CREATE TABLE us_snail_addy (
  address_id SERIAL NOT NULL PRIMARY KEY
, street1 TEXT NOT NULL
, street2 TEXT
, street3 TEXT
, city TEXT NOT NULL
, postal us_postal_code NOT NULL
);

相容性

CREATE DOMAIN 命令符合 SQL 標準。

又見

ALTER DOMAIN, DROP DOMAIN