ALTER DOMAIN — 更改網域的定義
ALTER DOMAINname
{ SET DEFAULTexpression
| DROP DEFAULT } ALTER DOMAINname
{ SET | DROP } NOT NULL ALTER DOMAINname
ADDdomain_constraint
[ NOT VALID ] ALTER DOMAINname
DROP CONSTRAINT [ IF EXISTS ]constraint_name
[ RESTRICT | CASCADE ] ALTER DOMAINname
RENAME CONSTRAINTconstraint_name
TOnew_constraint_name
ALTER DOMAINname
VALIDATE CONSTRAINTconstraint_name
ALTER DOMAINname
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER DOMAINname
RENAME TOnew_name
ALTER DOMAINname
SET SCHEMAnew_schema
wheredomain_constraint
is: [ CONSTRAINTconstraint_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 CONSTRAINT
、ALTER DOMAIN VALIDATE CONSTRAINT
和 ALTER 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標準,但 OWNER
、 RENAME
、 SET SCHEMA
和 VALIDATE CONSTRAINT
變體除外,它們是 PostgreSQL 擴充功能。ADD CONSTRAINT
變體的 NOT VALID
子句也是 PostgreSQL 擴充功能。
如果您在文件中發現任何不正確、與特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。