# 更改域
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_ROLE | CURRENT_USER | SESSION_USER }
ALTER DOMAIN name
RENAME TO new_name
ALTER DOMAIN name
SET SCHEMA new_schema
# 描述
更改域
更改现有域的定义。有几种子形式:
放
/删除默认值
这些表单设置或删除域的默认值。请注意,默认值仅适用于后续插入
命令;它们不会影响使用域的表中已经存在的行。
放
/删除不为空
这些形式改变了域被标记为允许 NULL 值还是拒绝 NULL 值。你只能设置非空
当使用域的列不包含空值时。
添加 *
域约束* [ 无效 ]
此表单使用与以下相同的语法向域添加新约束创建域
.将新约束添加到域时,将根据新添加的约束检查使用该域的所有列。可以通过使用添加新约束来抑制这些检查无效
选项;约束可以稍后使用ALTER DOMAIN ...验证约束
.始终检查新插入或更新的行是否符合所有约束,即使是那些标记的无效
.无效
只接受查看
约束。
删除约束 [如果存在]
这种形式放弃了对域的约束。如果如果存在
已指定且约束不存在,则不会引发错误。在这种情况下,将发出通知。
重命名约束
此表单更改域上的约束名称。
验证约束
此表单验证先前添加为的约束无效
,即验证域类型的表列中的所有值是否满足指定的约束。
所有者
此表单将域的所有者更改为指定的用户。
改名
此表单更改域的名称。
设置架构
这种形式改变了域的模式。与域关联的任何约束也将移至新模式中。
您必须拥有要使用的域变换域
。若要更改域的架构,还必须创造
新模式的特权。要更改所有者,您还必须是新所有者角色的直接或间接成员,并且该角色必须具有创造
域架构上的权限。(这些限制强制规定,更改所有者不会做任何你无法通过删除和重新创建域来做的事情。但是,超级用户无论如何都可以更改任何域的所有权。)
# 参数
名称
要更改的现有域的名称(可能是架构限定的)。
域约束
域的新域约束。
你的名字
要删除或重命名的现有约束的名称。
无效
不要验证现有存储数据的约束有效性。
大量
自动删除依赖于约束的对象,并依次删除依赖于这些对象的所有对象(请参见第5.14节).
限制
如果存在任何从属对象,请拒绝删除约束。这是默认行为。
新名字
域的新名称。
新的_约束_名称
约束的新名称。
新老板
域的新所有者的用户名。
新的_模式
域的新架构。
# 笔记
虽然改变域添加约束
如果试图验证现有存储的数据是否满足新的约束条件,则此检查不是防弹的,因为命令无法“查看”新插入或更新且尚未提交的表行。如果存在并发操作可能插入坏数据的危险,那么继续操作的方法是使用无效
选项,提交该命令,等待提交完成之前启动的所有事务,然后发出改变域验证约束
搜索违反约束的数据。这种方法是可靠的,因为一旦提交了约束,所有新事务都将保证对域类型的新值强制执行它。
目前,改变域添加约束
, 改变域验证约束
和ALTER DOMAIN SET NOT NULL
如果命名域或任何派生域在数据库中任何表的容器类型列(复合、数组或范围列)中使用,则将失败。它们最终应该得到改进,以便能够验证此类嵌套值的新约束。
# 例子
添加非空
对域的约束:
ALTER DOMAIN zipcode SET 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;
# 兼容性
变换域
符合SQL标准,但物主
, 改名
, 设置模式
和验证约束
变体,即PostgreSQL扩展。这个无效
合同条款添加约束
variant也是PostgreSQL的扩展。