ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# ALTER SEQUENCE ## Name ALTER SEQUENCE --  更改一个序列生成器的定义 ## Synopsis ``` ALTER SEQUENCE [ IF EXISTS ] _name_ [ INCREMENT [ BY ] _increment_ ] [ MINVALUE _minvalue_ | NO MINVALUE ] [ MAXVALUE _maxvalue_ | NO MAXVALUE ] [ START [ WITH ] _start_ ] [ RESTART [ [ WITH ] _restart_ ] ] [ CACHE _cache_ ] [ [ NO ] CYCLE ] [ OWNED BY { _table_name_._column_name_ | NONE } ] ALTER SEQUENCE [ IF EXISTS ] _name_ OWNER TO _new_owner_ ALTER SEQUENCE [ IF EXISTS ] _name_ RENAME TO _new_name_ ALTER SEQUENCE [ IF EXISTS ] _name_ SET SCHEMA _new_schema_ ``` ## 描述 `ALTER SEQUENCE` 命令修改一个现有的序列发生器的参数。 任何没有明确在 `ALTER SEQUENCE` 命令里声明的参数都将保留原先的设置。 要使用`ALTER SEQUENCE`,你必须是该序列的所有者。 要改变一个序列的模式,你必须在新的模式上有 `CREATE` 权限。 要改变一个序列的所有者,你必须也是新的所有角色的直接或者间接的成员,并且那个角色必须有序列模式上的`CREATE` 权限。 (这些约束强制在改变所有者时只能做删除或者创建序列时能做的操作。然而,超级用户可以以任何方式改变任意序列的成员关系。) ## 参数 `_name_` 一个要修改的序列的名字(可以有模式修饰)。 `IF EXISTS` 当序列不存在时使用该选项不会出现错误信息,仅有一个提示信息。 `_increment_` `INCREMENT BY` `_increment_`选项是可选的。 一个正数会让序列成为递增序列,负数则成为递减序列。如果没有声明,将沿用原来的递增值。 `_minvalue_``NO MINVALUE` `MINVALUE` `_minvalue_`是一个可选选项,它决定一个序列可以生成的最小的值。 如果声明了`NO MINVALUE`,那么将使用缺省值,对于递增和递减的序列分别是1和-2<sup class="calibre28">63</sup>-1。 如果没有声明则沿用当前的最小值。 `_maxvalue_` `NO MAXVALUE` `MAXVALUE` `_maxvalue_`是一个可选选项,它决定一个序列可以生成的最大的值。 如果声明了`NO MAXVALUE`那么将使用缺省值,对于递增和递减的序列分别是2<sup class="calibre28">63</sup>-1和-1。 如果没有声明则沿用当前的最大值。 `_start_` `START WITH` `_start_`是一个可选选项,它修改序列的起始值。 这对序列_当前_值没有影响;它仅设置将来的`ALTER SEQUENCE RESTART`命令将会使用的值。 `_restart_` `RESTART [ WITH` `_restart_` ]是一个可选选项,它改变序列的当前值。 这相当于用`is_called` = `false`参数调用`setval` 函数 :指定的值将会通过`nextval`的_next_调用返回。 不使用`_restart_`参数值来使用`RESTART`选项相当于使用`CREATE SEQUENCE`或由`ALTER SEQUENCE START WITH`设置的初始值。 `_cache_` `CACHE` `_cache_`选项打开序列号预分配功能以及为了快速存取而在内存中存储的功能。 最小值是1(表示每次只能生成一个数值,没有缓冲)。如果没有声明,将沿用旧的缓冲值。 `CYCLE` 可选的 `CYCLE`选项用于设置升序序列或是降序序列在达到`_maxvalue_`或者`_minvalue_`的时候循环使用。 如果达到了极限, 那么生成的下一个数字将分别是`_minvalue_`或者`_maxvalue_`。 `NO CYCLE` 如果声明了可选的`NO CYCLE`选项,任何在序列达到其极限后对`nextval`的调用都将返回错误。 如果未声明`CYCLE`或者`NO CYCLE`,那么将沿用原有的循环行为。 `OWNED BY` `_table_name_`.`_column_name_` `OWNED BY NONE` `OWNED BY`选项将序列和一个表的特定字段关联, 这样,如果那个字段(或整个表)被删除了,那么序列也将被自动删除。 如果序列已经与表有关联后,使用这个选项后新关联将覆盖旧有的关联。 指定的表必须与序列的所有者相同并且在同一个模式中。 使用`OWNED BY NONE`将删除任何已经存在的关联,也就是让该序列变成"独立"序列。 `_new_owner_` 序列新所有者的用户名。 `_new_name_` 序列的新名称。 `_new_schema_` 序列的新模式。 ## 注意 为避免从同一序列获取序列值的并发事务阻塞,在序列产生参数上的`ALTER SEQUENCE`的影响从不回滚; 这些改变会立刻生效并且是不可逆的;然而,`OWNED BY`、`OWNER TO`、`RENAME TO`和`SET SCHEMA`选项会引起可被回滚的普通更新。 除了当前的正在运行取值操作,`ALTER SEQUENCE`不会立刻影响后台的`nextval`结果 。 序列在使用完所有缓存的序列值后才会使用变化后的序列参数值。当前后台正在运行取值操作将会立刻受到影响。 `ALTER SEQUENCE`不影响序列的`currval`状态。(在PostgreSQL 8.3之前,有时会影响。) 由于历史原因,`ALTER TABLE`也可用于序列;但是`ALTER TABLE`仅有的与序列有关的变化等价于前面所示的形式。 ## 例子 将序列serial设置为从105重新开始取值: ``` ALTER SEQUENCE serial RESTART WITH 105; ``` ## 兼容性 `ALTER SEQUENCE`遵从SQL标准,但`START WITH`、 `OWNED BY`、`OWNER TO`、`RENAME TO`和`SET SCHEMA`选项是 PostgreSQL的扩展。 ## 参见 [CREATE SEQUENCE](#calibre_link-42), [DROP SEQUENCE](#calibre_link-619)