ALTER DOMAIN
更改一個現有域的定義。
簡介
有幾種形式:
SET
/DROP DEFAULT
這些形式設置或者移除一個域的默認值。注意默認值只會應用到后續的 INSERT
命令,它們不影響使用該域的已經存在于表中的行。
SET
/DROP NOT NULL
這些形式更改一個域是被標記為允許 NULL 值還是拒絕 NULL 值。只有當使用該域的列不包含空值時才能SET NOT NULL
。
ADD
domain_constraint
[ NOT VALID ]
這種形式使用和 CREATE DOMAIN 相同的語法為一個域增加一個新的約束。當一個新的約束被增加到一個域時,所有使用該域的列都會被根據新加的約束進行檢查。可以通過增加使用 NOT VALID
選項的新約束來抑制這類檢查,而該約束則可以在以后使用 ALTER DOMAIN ... VALIDATE CONSTRAINT
變為可用。新插入和更新的行總是會被根據所有約束進行檢查(包括被標記為 NOT VALID
的約束)。只有CHECK
約束接受 NOT VALID
。
DROP CONSTRAINT [ IF EXISTS ]
這種形式刪除一個域上的約束。如果指定了IF EXISTS
并且約束不存在,不會拋出錯誤。在這種情況下會轉而發出一個提示。
RENAME CONSTRAINT
這種形式更改一個域上的一個約束的名稱。
VALIDATE CONSTRAINT
這種形式驗證一個之前作為NOT VALID
增加的約束,也就是說它驗證該域類型的表列中所有值滿足指定的約束。
OWNER
這種形式更改域的擁有者為指定用戶。
RENAME
這種形式更改域的名稱。
SET SCHEMA
這種形式更改域的模式。任何與該域關聯的約束也被會移動到新的模式中。
要使用ALTER DOMAIN
,你必須擁有該域。要更改一個域的模式, 你還必須具有新模式上的CREATE
特權。要更改擁有者,你還必須是新擁有角色的一個直接或者間接成員,并且該角色必須具有該域的模式上的 CREATE
特權(這些限制強制修改擁有者不能做一些通過刪除和重建域做不到的事情。不過,一個超級用戶怎么都能更改任何域的所有權。)。
語法
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_USER | SESSION_USER }
ALTER DOMAIN name
RENAME TO new_name
ALTER DOMAIN name
SET SCHEMA new_schema
參數
name
要修改的一個現有域的名稱(可能是模式限定的)。
domain_constraint
用于該域的新域約束。
constraint_name
要刪除或重命名的一個現有約束的名稱。
NOT VALID
不為約束的合法性驗證現有的存儲數據。
CASCADE
自動刪除依賴于該約束的對象,并且接著刪除依賴于那些對象的所有對象。
RESTRICT
如果有任何依賴對象則拒絕刪除該約束,這是默認行為。
new_name
域的新名稱。
new_constraint_name
約束的新名稱。
new_owner
域的新擁有者的用戶名。
new_schema
域的新模式。
說明
盡管ALTER DOMAIN ADD CONSTRAINT
嘗試驗證現有存儲的數據是否滿足新約束,但此檢查不是萬無一失的,因為命令無法“see”新插入或更新但尚未提交的表行。 如果存在并發操作可能插入壞數據的危險,則處理方法是使用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;