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
描述
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
,新插入或更新的行也会始终针对所有约束进行检查。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.14 节)。
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;
重命名域上的检查约束
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扩展。