============ ALTER DOMAIN ============ .. container:: refentry :name: SQL-ALTERDOMAIN .. container:: titlepage .. container:: refnamediv .. rubric:: ALTER DOMAIN :name: alter-domain ALTER DOMAIN — 更改一个域的定义 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis 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 .. container:: refsect1 :name: id-1.9.3.9.5 .. rubric:: 描述 :name: 描述 ``ALTER DOMAIN``\ 更改一个现有域的定义。有几种形式: .. container:: variablelist ``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``\ 的约束)。只有\ ``CHECK``\ 约束接受 ``NOT VALID``\ 。 ``DROP CONSTRAINT [ IF EXISTS ]`` 这种形式删除一个域上的约束。如果指定了\ ``IF EXISTS``\ 并且 约束不存在,不会抛出错误。在这种情况下会转而发出一个提示。 ``RENAME CONSTRAINT`` 这种形式更改一个域上的一个约束的名称。 ``VALIDATE CONSTRAINT`` 这种形式验证一个之前作为\ ``NOT VALID``\ 增加的约束,也就是说 它验证该域类型的表列中所有值满足指定的约束。 ``OWNER`` 这种形式更改域的拥有者为指定用户。 ``RENAME`` 这种形式更改域的名称。 ``SET SCHEMA`` 这种形式更改域的模式。任何与该域关联的约束也被会移动到新的模式中。 要使用\ ``ALTER DOMAIN``\ ,你必须拥有该域。要更改一个域的模式, 你还必须具有新模式上的\ ``CREATE``\ 特权。要更改拥有者,你还必须 是新拥有角色的一个直接或者间接成员,并且该角色必须具有该域的模式上的 ``CREATE``\ 特权(这些限制强制修改拥有者不能做一些通过删除和重 建域做不到的事情。不过,一个超级用户怎么都能更改任何域的所有权。)。 .. container:: refsect1 :name: id-1.9.3.9.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``name``* 要修改的一个现有域的名称(可能是模式限定的)。 *``domain_constraint``* 用于该域的新域约束。 *``constraint_name``* 要删除或重命名的一个现有约束的名称。 ``NOT VALID`` 不为约束的合法性验证现有的存储数据。 ``CASCADE`` 自动删除依赖于该约束的对象,并且接着删除依赖于那些对象的 所有对象(见\ `第 5.14 节 `__\ )。 ``RESTRICT`` 如果有任何依赖对象则拒绝删除该约束。这是默认行为。 *``new_name``* 域的新名称。 *``new_constraint_name``* 约束的新名称。 *``new_owner``* 域的新拥有者的用户名。 *``new_schema``* 域的新模式。 .. container:: refsect1 :name: id-1.9.3.9.7 .. rubric:: 注解 :name: 注解 尽管\ ``ALTER DOMAIN ADD CONSTRAINT``\ 尝试验证现有存储的数据是否满足新约束,但此检查不是万无一失的,因为命令无法“see”新插入或更新但尚未提交的表行。 如果存在并发操作可能插入坏数据的危险,则处理方法是使用\ ``NOT VALID``\ 选项添加约束,提交该命令,等到所有事务在提交完成之前启动,然后发出\ ``ALTER DOMAIN VALIDATE CONSTRAINT``\ 以搜索违反约束的数据。 此方法是可靠的,因为一旦提交约束,所有新事务都保证针对域类型的新值强制执行约束。 当前,如果域或者任何衍生域被数据库中的任意表的一个容器类型 列(组合、数组、范围类型的列)使用,\ ``ALTER DOMAIN ADD CONSTRAINT``\ 、\ ``ALTER DOMAIN VALIDATE CONSTRAINT``\ 和 ``ALTER DOMAIN SET NOT NULL``\ 将会失败。这些命令最终将 会被改进成能够对这类嵌套值进行约束验证。 .. container:: refsect1 :name: id-1.9.3.9.8 .. rubric:: 示例 :name: 示例 要把一个\ ``NOT NULL``\ 约束加到一个域: .. code:: programlisting ALTER DOMAIN zipcode SET NOT NULL; 要从一个域中移除一个\ ``NOT NULL``\ 约束: .. code:: programlisting ALTER DOMAIN zipcode DROP NOT NULL; 要把一个检查约束增加到一个域: .. code:: programlisting ALTER DOMAIN zipcode ADD CONSTRAINT zipchk CHECK (char_length(VALUE) = 5); 要从一个域移除一个检查约束: .. code:: programlisting ALTER DOMAIN zipcode DROP CONSTRAINT zipchk; 要重命名一个域上的一个检查约束: .. code:: programlisting ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check; 要把域移动到一个不同的模式: .. code:: programlisting ALTER DOMAIN zipcode SET SCHEMA customers; .. container:: refsect1 :name: SQL-ALTERDOMAIN-COMPATIBILITY .. rubric:: 兼容性 :name: 兼容性 ``ALTER DOMAIN`` conforms to the SQL standard, except for the 除\ ``OWNER``\ 、\ ``RENAME``\ 、\ ``SET SCHEMA`` 以及\ ``VALIDATE CONSTRAINT``\ 变体之外(它们是 PostgreSQL的扩展), ``ALTER DOMAIN``\ 符合SQL标准。 ``ADD CONSTRAINT``\ 变体的\ ``NOT VALID``\ 子句也是一个 PostgreSQL扩展。 .. container:: refsect1 :name: SQL-ALTERDOMAIN-SEE-ALSO .. rubric:: 另见 :name: 另见 `CREATE DOMAIN `__, `DROP DOMAIN `__