Postgresql 中文操作指南

ALTER DOMAIN

ALTER DOMAIN—更改域的定义

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_ROLE | CURRENT_USER | SESSION_USER }
ALTER DOMAIN name
    RENAME TO new_name
ALTER DOMAIN name
    SET SCHEMA new_schema

Description

ALTER DOMAIN 更改现有域的定义。有几种子格式:

  • SET/DROP DEFAULT

    • 这些格式可设置或删除域的默认值。请注意,默认值仅适用于后续的 INSERT 命令;它们不会影响已使用该域的表中的行。

  • SET/DROP NOT NULL

    • 这些格式会更改将哪个域标记为允许 NULL 值或拒绝 NULL 的操作。仅当使用该域的列不包含 NULL 值时,您才能执行 SET NOT NULL 操作。

  • ADD _domain_constraint [ NOT VALID ]_

    • 此格式使用与 CREATE DOMAIN 相同的语法向域添加一个新的约束。将新约束添加到域时,将根据新添加的约束检查使用该域的所有列。可以使用 NOT VALID 选项添加新约束以禁止这些检查;稍后可以使用 ALTER DOMAIN …​ VALIDATE CONSTRAINT 使该约束变为有效。新插入或更新的行总是根据所有约束进行检查,即使这些约束被标记为 NOT VALIDNOT VALID 仅接受 CHECK 约束。

  • DROP CONSTRAINT [ IF EXISTS ]

    • 此格式删除域上的约束。如果指定了 IF EXISTS 且约束不存在,则不会引发任何错误。在这种情况下,将发出一个通知。

  • RENAME CONSTRAINT

    • 此格式更改域上约束的名称。

  • VALIDATE CONSTRAINT

    • 此窗体验证之前作为 NOT VALID 添加的约束,即验证属于域类型的表列中的所有值是否满足指定的约束。

  • OWNER

    • 此窗体将域的所有者更改为指定的使用者。

  • RENAME

    • 此窗体更改域的名称。

  • SET SCHEMA

    • 此窗体更改域的架构。与域关联的任何约束也会移入新架构。

您必须拥有该域才能使用 ALTER DOMAIN 。若要更改域的架构,您还必须在新架构上具有 CREATE 权限。若要变更所有者,您必须能够 SET ROLE 至新的拥有角色,并且该角色必须对该域的架构具有 CREATE 权限。(这些限制实施了对域的所有者所做的变更并不会通过删除和重新创建该域而执行任何操作。然而,超级使用者即便如此也可以变更任何域的所有权。)

Parameters

  • name

    • 要更改的现有域的名称(可以是架构限定名)。

  • domain_constraint

    • 域的新域约束。

  • constraint_name

    • 现有约束的名称,以便删除或重命名该约束。

  • NOT VALID

    • 不验证现有存储数据的约束有效性。

  • CASCADE

    • 自动删除依赖于该约束的对象,进而删除所有依赖于那些对象的其它对象(请参阅 Section 5.14 )。

  • RESTRICT

    • 如果存在任何依赖对象,则拒绝删除约束。这是默认行为。

  • new_name

    • 域的新名称。

  • new_constraint_name

    • 约束的新名称。

  • new_owner

    • 域新所有者的用户名。

  • new_schema

    • 域的新架构。

Notes

虽然 ALTER DOMAIN ADD CONSTRAINT 尝试验证现有存储数据是否满足新约束,但此检查并非万无一失,这是因为该命令无法“看到”新插入或更新但尚未提交的表行。如果存在并发操作可能会插入无效数据,则应该采取以下方法进行:使用 NOT VALID 选项添加该约束,提交该命令,等到在那次提交之前启动的所有事务都完成,然后发出 ALTER DOMAIN VALIDATE CONSTRAINT 以搜索违反该约束的数据。该方法很可靠,这是因为一旦提交该约束,就可以保证所有新事务都针对该域类型的任何新值强制执行此约束。

当前,如果指定域或任何衍生域在数据库的任何表内用作容器类型的列(复合列、数组列或范围列)中,则 ALTER DOMAIN ADD CONSTRAINTALTER DOMAIN VALIDATE CONSTRAINTALTER DOMAIN SET NOT NULL 将会失败。最终应该对其加以改进,以针对此类嵌套值验证新约束。

Examples

若要向域中添加 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;

Compatibility

ALTER DOMAIN 遵循 SQL 标准,只除外 OWNERRENAMESET SCHEMAVALIDATE CONSTRAINT 变体,它们是 PostgreSQL 扩展。 ADD CONSTRAINT 变体的 NOT VALID 子句也是 PostgreSQL 扩展。