PostgreSQL ALTER DOMAIN
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_nameALTER DOMAIN
name VALIDATE CONSTRAINT constraint_nameALTER DOMAIN
name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }ALTER DOMAIN
name RENAME TO new_nameALTER DOMAIN
name SET SCHEMA new_schema
描述
ALTER DOMAIN
更改一个现有域的定义。有几种形式:
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
特权(这些限制强制修改拥有者不能做一些通过删除和重 建域做不到的事情。不过,一个超级用户怎么都能更改任何域的所有权。)。
参数
name
-
要修改的一个现有域的名称(可能是模式限定的)。
domain_constraint
-
用于该域的新域约束。
constraint_name
-
要删除或重命名的一个现有约束的名称。
NOT VALID
-
不为约束的合法性验证现有的存储数据。
CASCADE
-
自动删除依赖于该约束的对象,并且接着删除依赖于那些对象的 所有对象(见第 5.14 节)。
RESTRICT
-
如果有任何依赖对象则拒绝删除该约束。这是默认行为。
new_name
-
域的新名称。
new_constraint_name
-
约束的新名称。
new_owner
-
域的新拥有者的用户名。
new_schema
-
域的新模式。
注解
尽管ALTER DOMAIN ADD CONSTRAINT
尝试验证现有存储的数据是否满足新约束,但此检查不是万无一失的,因为命令无法“see”新插入或更新但尚未提交的表行。 如果存在并发操作可能插入坏数据的危险,则处理方法是使用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
conforms to the SQL
standard, except for the 除OWNER
、RENAME
、SET SCHEMA
以及VALIDATE CONSTRAINT
变体之外(它们是
PostgreSQL的扩展), ALTER DOMAIN
符合SQL标准。 ADD CONSTRAINT
变体的NOT VALID
子句也是一个 PostgreSQL扩展。