2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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

此形式更改域的模式。與該域關聯的任何約束也會移動到新模式中。

您必須擁有該域才能使用 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;

重命name域上的檢查約束

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 DOMAIN, DROP DOMAIN

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。