支援版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

ALTER DOMAIN

ALTER DOMAIN — 變更網域的定義

概要

ALTER DOMAIN name
    { SET DEFAULT expression | DROP DEFAULT }
ALTER DOMAIN name
    { SET | DROP } NOT NULL
ALTER DOMAIN name
    ADD domain_constraint [ NOT VALID ]
ALTER DOMAIN name
    DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]
ALTER DOMAIN name
     RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER DOMAIN name
    VALIDATE CONSTRAINT constraint_name
ALTER DOMAIN name
    OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER DOMAIN name
    RENAME TO new_name
ALTER DOMAIN name
    SET SCHEMA new_schema

where domain_constraint is:

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

說明

ALTER DOMAIN 變更現有網域的定義。它有以下幾種子形式:

SET/DROP DEFAULT

這些形式會設定或移除網域的預設值。請注意,預設值僅適用於後續的 INSERT 命令;它們不會影響已在使用該網域的表格中的列。

SET/DROP NOT NULL

這些形式會變更網域是否被標記為允許 NULL 值或拒絕 NULL 值。只有在使用了該網域的欄位不包含任何 NULL 值時,才能 SET NOT NULL

ADD domain_constraint [ NOT VALID ]

此形式會為網域新增一個新的約束條件。當為網域新增一個新的約束條件時,所有使用該網域的欄位都會針對這個新加入的約束條件進行檢查。可以透過使用 NOT VALID 選項新增約束條件來抑制這些檢查;該約束條件可以在稍後使用 ALTER DOMAIN ... VALIDATE CONSTRAINT 使其生效。新插入或更新的列始終會針對所有約束條件進行檢查,即使是那些標記為 NOT VALID 的約束條件。NOT VALID 僅適用於 CHECK 約束條件。

DROP CONSTRAINT [ IF EXISTS ]

此形式會移除網域上的約束條件。如果指定了 IF EXISTS 且該約束條件不存在,則不會拋出錯誤。在這種情況下,會發出通知。

RENAME CONSTRAINT

此形式會變更網域上約束條件的名稱。

VALIDATE CONSTRAINT

此形式會驗證先前新增為 NOT VALID 的約束條件,也就是說,它會驗證網域類型表格欄位中的所有值是否滿足指定的約束條件。

OWNER

此形式會將網域的所有者變更為指定的使用者。

RENAME

此形式會變更網域的名稱。

SET SCHEMA

此形式會變更網域的 schema。與網域關聯的任何約束條件也會移至新的 schema 中。

您必須擁有該網域才能使用 ALTER DOMAIN。若要變更網域的 schema,您還必須在新的 schema 上具有 CREATE 權限。若要變更所有者,您必須能夠 SET ROLE 為新的所有者角色,並且該角色必須在網域的 schema 上具有 CREATE 權限。(這些限制強制執行變更所有者不會執行任何您無法透過刪除和重新建立網域來完成的操作。但是,超級使用者可以變更任何網域的所有權。)

參數

name

要變更的現有網域的名稱(可能具有 schema 限定詞)。

domain_constraint

網域的新網域約束條件。

constraint_name

要移除或重新命名的現有約束條件的名稱。

NOT VALID

不驗證現有儲存資料的約束條件有效性。

CASCADE

自動移除依賴於該約束條件的物件,以及依賴於這些物件的所有物件(請參閱第 5.15 節)。

RESTRICT

如果存在任何依賴物件,則拒絕移除該約束條件。這是預設行為。

new_name

網域的新名稱。

new_constraint_name

約束條件的新名稱。

new_owner

網域新所有者的使用者名稱。

new_schema

網域的新 schema。

備註

雖然 ALTER DOMAIN ADD CONSTRAINT 嘗試驗證現有儲存資料是否滿足新的約束條件,但此檢查並非萬無一失,因為該命令無法看到新插入或更新且尚未提交的表格列。如果存在並行操作可能會插入錯誤資料的風險,則進行操作的方式是使用 NOT VALID 選項新增約束條件,提交該命令,等到在該提交之前啟動的所有交易都已完成,然後發出 ALTER DOMAIN VALIDATE CONSTRAINT 以搜尋違反約束條件的資料。此方法是可靠的,因為一旦提交了約束條件,就可以保證所有新交易都會針對網域類型的新值強制執行該約束條件。

目前,如果指定的網域或任何衍生網域在資料庫中任何資料表的容器型別欄位(複合、陣列或範圍欄位)中使用,則 ALTER DOMAIN ADD CONSTRAINTALTER DOMAIN VALIDATE CONSTRAINTALTER DOMAIN SET NOT NULL 將會失敗。最終應該改進這些指令,使其能夠驗證此類巢狀值的新約束。

範例

要將 NOT NULL 約束新增到網域

ALTER DOMAIN zipcode SET NOT NULL;

要從網域中移除 NOT NULL 約束

ALTER DOMAIN zipcode DROP NOT NULL;

要將檢查約束新增到網域

ALTER DOMAIN zipcode ADD CONSTRAINT zipchk CHECK (char_length(VALUE) = 5);

要從網域中移除檢查約束

ALTER DOMAIN zipcode DROP CONSTRAINT zipchk;

要重新命名網域上的檢查約束

ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check;

要將網域移至不同的綱要

ALTER DOMAIN zipcode SET SCHEMA customers;

相容性

ALTER DOMAIN 符合SQL標準,除了 OWNERRENAMESET SCHEMAVALIDATE CONSTRAINT 變體之外,這些都是 PostgreSQL 擴充功能。 ADD CONSTRAINT 變體的 NOT VALID 子句也是 PostgreSQL 擴充功能。

提交更正

如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步釐清的地方,請使用此表單來回報文件問題。