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_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值。仅当使用该域的列不包含空值时,才可设置 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 会尝试验证现有存储数据是否满足新约束,但此检查并非万无一失,因为该命令无法“看到”尚未提交的新插入或更新的表行。若存在并发操作可能插入无效数据的风险,应采用以下方案:使用 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 变形,这些是 YMatrix 的扩展功能。 ADD CONSTRAINT 中的 NOT VALID 变形也是 YMatrix 的扩展功能。

另见

CREATE DOMAIN, DROP DOMAIN