多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# ALTER DOMAIN ## Name 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_ 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 值。 在使用域的字段包含非空的值的时候,你只可以使用 `SET NOT NULL`。 ADD `_domain_constraint_` [ NOT VALID ] 这种形式向域中增加一种新的约束,使用的语法和 [CREATE DOMAIN](#calibre_link-567) 一样。 当一个新的约束增加至域中时,使用这个域的所有列将会按新增的约束条件进行检查。 这些检查也可以通过使用`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`和`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; ``` ## 兼容性 除了`OWNER`、`RENAME`、`SET SCHEMA`和`VALIDATE CONSTRAINT`这些选项是PostgreSQL扩展外, `ALTER DOMAIN`语句基本与SQL标准兼容。 `ADD CONSTRAINT`相关的`NOT VALID`选项也是PostgreSQL的扩展。 ## 参见 [CREATE DOMAIN](#calibre_link-567), [DROP DOMAIN](#calibre_link-566)