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 扩展。
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。