On this page
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_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 值。当使用域的列不包含空值时,您只能
SET NOT NULL
。
- 这些形式会更改是将域标记为允许 NULL 值还是拒绝 NULL 值。当使用域的列不包含空值时,您只能
ADD domain_constraint [ NOT VALID ]
- 此表单使用与CREATE DOMAIN相同的语法将新约束添加到域。将新约束添加到域时,将对照新添加的约束检查使用该域的所有列。可以通过使用
NOT VALID
选项添加新约束来抑制这些检查。稍后可以使用ALTER DOMAIN ... VALIDATE CONSTRAINT
使约束生效。始终根据所有约束(即使标记为NOT VALID
的约束)检查新插入或更新的行。NOT VALID
仅接受CHECK
约束。
- 此表单使用与CREATE DOMAIN相同的语法将新约束添加到域。将新约束添加到域时,将对照新添加的约束检查使用该域的所有列。可以通过使用
DROP CONSTRAINT [ IF EXISTS ]
- 这种形式在域上放下了约束。如果指定
IF EXISTS
且该约束不存在,则不会引发任何错误。在这种情况下,将发出通知。
- 这种形式在域上放下了约束。如果指定
RENAME CONSTRAINT
- 此表单更改域上约束的名称。
VALIDATE CONSTRAINT
- 此表单验证先前添加为
NOT VALID
的约束,即,它验证域类型的表列中的所有值均满足指定的约束。
- 此表单验证先前添加为
OWNER
- 此表单将域的所有者更改为指定的用户。
RENAME
- 此表单更改域的名称。
SET SCHEMA
- 此形式更改域的架构。与该域相关联的所有约束也将移至新架构中。
您必须拥有域才能使用ALTER DOMAIN
。要更改域的架构,您还必须对新架构具有CREATE
特权。要更改所有者,您还必须是新拥有角色的直接或间接成员,并且该角色必须对域的架构具有CREATE
特权。 (这些限制规定,更改所有者不能通过删除并重新创建域来完成您无法做的任何事情.但是,超级用户仍然可以更改任何域的所有权.)
Parameters
name
- 要更改的现有域的名称(可能是模式限定的)。
domain_constraint
- 域的新域约束。
constraint_name
- 要删除或重命名的现有约束的名称。
NOT VALID
- 不要验证现有存储数据的约束有效性。
CASCADE
- 自动删除依赖于约束的对象,然后自动删除依赖于那些对象的所有对象(请参见Section 5.13)。
RESTRICT
- 如果有任何依赖对象,则拒绝删除约束。这是默认行为。
new_name
- 域的新名称。
new_constraint_name
- 约束的新名称。
new_owner
- 域的新所有者的用户名。
new_schema
- 域的新架构。
Notes
尽管ALTER DOMAIN ADD CONSTRAINT
试图验证现有存储的数据是否满足新的约束,但是此检查不是防弹的,因为该命令无法“看到”新插入或更新且尚未提交的表行。如果存在并发操作可能会插入错误数据的危险,则 continue 的方法是使用NOT VALID
选项添加约束,提交该命令,await 所有事务开始,直到该提交完成,然后发出ALTER DOMAIN VALIDATE CONSTRAINT
来搜索数据违反约束。此方法之所以可靠,是因为一旦提交了约束,就可以保证所有新事务都针对域类型的新值强制实施该约束。
当前,如果在数据库中任何表的复合类型列中使用经过验证的命名域或任何派生域,则ALTER DOMAIN ADD CONSTRAINT
,ALTER DOMAIN VALIDATE CONSTRAINT
和ALTER 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 标准,但OWNER
,RENAME
,SET SCHEMA
和VALIDATE CONSTRAINT
变体是 PostgreSQL 扩展。 ADD CONSTRAINT
变体的NOT VALID
子句也是 PostgreSQL 扩展。