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
ALTER DOMAIN更改一个现有域的定义。有几种形式:
这些形式设置或者移除一个域的默认值。注意默认值只会应用到后续的 INSERT命令,它们不影响使用该域的已经存在于表中的行。
这些形式更改一个域是被标记为允许 NULL 值还是拒绝 NULL 值。 只有当使用该域的列不包含空值时才能SET NOT NULL。
这种形式使用和CREATE DOMAIN 相同的语法为一个域增加一个新的约束。当一个新的约束增加到一个域时, 所有使用该域的列都会根据新加的约束进行检查。可以通过增加使用 NOT VALID选项的新约束来抑制这类检查, 而该约束则可以在以后使用ALTER DOMAIN ... VALIDATE CONSTRAINT 生效。新插入或更新的行总是会按所有约束进行检查(甚至是标记为 NOT VALID的约束)。只有CHECK 约束接受NOT VALID。
这种形式删除一个域上的约束。如果指定了IF EXISTS 并且约束不存在,不会抛出错误。在这种情况下会发出一个提示。
这种形式更改一个域上的一个约束的名称。
这种形式验证一个之前作为NOT VALID增加的约束,也就是说, 验证使用该域的列中所有数据是否满足指定的约束。
这种形式更改域的拥有者为指定用户。
这种形式更改域的名称。
这种形式更改域的模式。任何与该域相关的约束也被会移动到新的模式中。
要使用ALTER DOMAIN,你必须拥有该域。要更改一个域的模式, 你还必须具有新模式上的CREATE权限。要更改拥有者, 你还必须是新拥有角色的一个直接或者间接成员,并且该角色必须具有该域的模式上的 CREATE特权 (这些限制强制修改拥有者不能通过删除和重建域做任何你不能做的事情。不过, 超级用户可以更改任何域的所有权。)。
要修改的一个现有域的名称(可能是模式限定的)。
用于该域的新域约束。
要删除或重命名的一个现有约束的名称。
不验证现有列数据的约束有效性。
自动删除依赖于该约束的对象。
如果有任何依赖对象则拒绝删除该约束。这是默认行为。
域的新名称。
约束的新名称。
域的新拥有者的用户名。
域的新模式。
当前,如果已验证的命名域或者任何派生的域用于数据库任意表的一个复合类型列中, 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;