支援的版本:目前 (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 值。 只有當使用該網域的欄位不包含任何空值時,您才能 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

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

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

參數

name

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

domain_constraint

網域的新網域約束。

constraint_name

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

NOT VALID

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

CASCADE

自動移除依賴於約束的物件,並依序移除依賴於那些物件的所有物件(請參閱 第 5.15 節)。

RESTRICT

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

new_name

網域的新名稱。

new_constraint_name

約束的新名稱。

new_owner

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

new_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 擴充功能。

另請參閱

CREATE DOMAINDROP DOMAIN

提交更正

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