PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# 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
    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`权限。 要修改所有者， 您还必须是新的所有角色的直接或间接成员，并且该成员必须在此域的模式上有`CREATE`权限。 （这些限制强制了修改该所有者不会做任何通过删除和重建域不能做的事情。不过，超级用户可以以任何方式修改任意域的所有关系。）

## 参数

`name`

  一个要修改的现有域的名字(可以有模式修饰)。

`domain_constraint`

  域的新域约束。

`constraint_name`

  要删除或是重命名的原有约束名。

`NOT VALID`

  不对已有数据进行约束的有效性验证。

`CASCADE`

  自动级联删除依赖这个约束的对象。

`RESTRICT`

  如果有任何依赖对象，则拒绝删除约束。这是缺省行为。

`new_name`

  域的新名称。

`new_constraint_name`

  约束的新名称。

`new_owner`

  域的新的所有者的用户名。

`new_schema`

  域的新的模式名。

## 注意

目前，如果命名的域或者任何派生的域用于数据库中任何一个表的一个复合列中， 那么 `ALTER DOMAIN ADD 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的扩展。

## 参见

CREATE DOMAIN, DROP DOMAIN

上一页 | 起始页 | 下一页
ALTER DEFAULT PRIVILEGES | 上一级 | ALTER EVENT TRIGGER