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_USER | SESSION_USER } ALTER DOMAINname
RENAME TOnew_name
ALTER DOMAINname
SET SCHEMAnew_schema
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
特权(这些限制强制修改拥有者不能做一些通过删除和重
建域做不到的事情。不过,一个超级用户怎么都能更改任何域的所有权。)。
name
要修改的一个现有域的名称(可能是模式限定的)。
domain_constraint
用于该域的新域约束。
constraint_name
要删除或重命名的一个现有约束的名称。
NOT VALID
不为约束的合法性验证现有的列数据。
CASCADE
自动删除依赖于该约束的对象,并且接着删除依赖于那些对象的 所有对象(见Section 5.13)。
RESTRICT
如果有任何依赖对象则拒绝删除该约束。这是默认行为。
new_name
域的新名称。
new_constraint_name
约束的新名称。
new_owner
域的新拥有者的用户名。
new_schema
域的新模式。
当前,如果所提及的域或者任何衍生域被用在数据库中的任意表的一个容器类型列(组合、数组或者范围列)中,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;
除OWNER
、RENAME
、SET SCHEMA
以及VALIDATE CONSTRAINT
变体之外(它们是PostgreSQL的扩展),ALTER DOMAIN
符合SQL标准。ADD CONSTRAINT
变体的NOT VALID
子句也是一个PostgreSQL扩展。