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特权(这些限制强制修改拥有者不能做一些通过删除和重 建域做不到的事情。不过,一个超级用户怎么都能更改任何域的所有权。)。
要修改的一个现有域的名称(可能是模式限定的)。
用于该域的新域约束。
要删除或重命名的一个现有约束的名称。
不为约束的合法性验证现有的列数据。
自动删除依赖于该约束的对象,并且接着删除依赖于那些对象的 所有对象(见第 5.13 节)。
如果有任何依赖对象则拒绝删除该约束。这是默认行为。
域的新名称。
约束的新名称。
域的新拥有者的用户名。
域的新模式。
当前,如果经过验证的所提及的域或者任何衍生域被数据库中的任意表的一个组合类型 列使用,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;