ALTER SEQUENCE
ALTER SEQUENCE — 更改一个序列发生器的定义
大纲
ALTER SEQUENCE [ IF EXISTS ]name
[ ASdata_type
] [ INCREMENT [ BY ]increment
] [ MINVALUEminvalue
| NO MINVALUE ] [ MAXVALUEmaxvalue
| NO MAXVALUE ] [ START [ WITH ]start
] [ RESTART [ [ WITH ]restart
] ] [ CACHEcache
] [ [ NO ] CYCLE ] [ OWNED BY {table_name
.column_name
| NONE } ] ALTER SEQUENCE [ IF EXISTS ]name
OWNER TO {new_owner
| CURRENT_USER | SESSION_USER } ALTER SEQUENCE [ IF EXISTS ]name
RENAME TOnew_name
ALTER SEQUENCE [ IF EXISTS ]name
SET SCHEMAnew_schema
描述
ALTER SEQUENCE
更改一个现有序列发生器的参数。
任何没有在ALTER SEQUENCE
命令中明确设置的参数
保持它们之前的设置。
要使用ALTER SEQUENCE
,你必须拥有该序列。要更改一个序列
的模式,你还必须拥有新模式上的CREATE
特权。要更改拥有者,你还必须
是新拥有角色的一个直接或者间接成员,并且该角色必须具有该域的模式上的
CREATE
特权(这些限制强制修改拥有者不能做一些通过删除和重
建该序列做不到的事情。不过,一个超级用户怎么都能更改任何序列的所有权。)。
参数
name
要修改的序列的名称(可以是模式限定的)。
IF EXISTS
在序列不存在时不要抛出一个错误。这种情况下会发出一个提示。
data_type
可选子句
AS
改变序列的数据类型。有效类型是data_type
smallint
、integer
和bigint
。当且仅当先前的最小值和最大值是旧数据类型的最小值或最大值时(换句话说, 如果序列是使用
NO MINVALUE
或NO MAXVALUE
, 隐式或显式创建的),则更改数据类型会自动更改序列的最小值和最大值。 否则,将保留最小值和最大值,除非将新值作为同一命令的一部分给出。 如果最小值和最大值不符合新的数据类型,则会生成错误。increment
子句
INCREMENT BY
是可选的。 一个正值将产生一个上升序列,一个负值会产生一个下降序列。如果 没有指定,旧的增量值将被保持。increment
minvalue
NO MINVALUE
可选的子句
MINVALUE
决定一个序列 能产生的最小值。如果指定了minvalue
NO MINVALUE
,上升序列和下降序列的默认值分别是 1 和 数据类型的最小值。如果这些选项都没有被指定,将保持当前的 最小值。maxvalue
NO MAXVALUE
可选的子句
MAXVALUE
决定一个序列 能产生的最大值。如果指定了maxvalue
NO MAXVALUE
,上升序列和下降序列的默认值分别是 数据类型的最大值和 -1。如果这些选项都没有被指定,将保持当前的 最大值。start
可选的子句
START WITH
更改该序列被记录的开始值。 这对于当前序列值没有影响,它会简单地设置 未来start
ALTER SEQUENCE RESTART
命令将会使用的值。restart
可选的子句
RESTART [ WITH
更改该序列的 当前值。这类似于用restart
]is_called
=false
调用setval
函数:被指定的值将会被 下一次nextval
调用返回。写上没有restart
值的RESTART
等效于提供被CREATE SEQUENCE
记录的或者上一次被ALTER SEQUENCE START WITH
设置的开始值。与
setval
调用相比,序列上的RESTART
操作是事务性的并阻止并发事务从同一序列中获取数字。 如果这不是所需的操作模式,则应使用setval
。cache
子句
CACHE
使得序列数字被预先 分配并且保存在内存中以便更快的访问。最小值是 1(每次只产生一个值,即 无缓存)。如果没有指定,旧的缓冲值将被保持。cache
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
将不会立即影响除当前后端外
其他后端中的nextval
结果,因为它们有预分配(缓存)的序列
值。在注意到序列生成参数被更改之前它们将用尽所有缓存的值。当前后端将被
立刻影响。
ALTER SEQUENCE
不会影响该序列的
currval
状态(在
PostgreSQL 8.3 之前有时会影响)。
ALTER SEQUENCE
阻塞并发nextval
、
currval
、lastval
和
setval
调用。
由于历史原因,ALTER TABLE
也可以被用于序列,
但是只有等效于上述形式的ALTER TABLE
变体才被
允许用于序列。
示例
在 105 重启一个被称为serial
的序列:
ALTER SEQUENCE serial RESTART WITH 105;
兼容性
ALTER SEQUENCE
符合SQL
标准,不过AS
、START WITH
、
OWNED BY
、OWNER TO
、RENAME TO
以及SET SCHEMA
子句是
PostgreSQL扩展。