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 值。當使用該域的列不包含 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;
重命name域上的檢查約束
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 擴充套件。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。