ALTER SEQUENCE
更改一个现有序列发生器的参数。
简介
ALTER SEQUENCE
更改一个现有序列发生器的参数。 任何没有在ALTER SEQUENCE
命令中明确设置的参数保持它们之前的设置。
要使用ALTER SEQUENCE
,你必须拥有该序列。要更改一个序列的模式,你还必须拥有新模式上的CREATE
特权。要更改拥有者,你还必须是新拥有角色的一个直接或者间接成员,并且该角色必须具有该域的模式上的 CREATE
特权(这些限制强制修改拥有者不能做一些通过删除和重建该序列做不到的事情。不过,一个超级用户怎么都能更改任何序列的所有权。)。
语法
ALTER SEQUENCE [ IF EXISTS ] name
[ AS data_type ]
[ 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 | CURRENT_USER | SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name
ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema
参数
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
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
将不会立即影响除当前后端外其他后端中的nextval
结果,因为它们有预分配(缓存)的序列值。在注意到序列生成参数被更改之前它们将用尽所有缓存的值。当前后端将被立刻影响。
ALTER SEQUENCE
不会影响该序列的 currval
状态。
ALTER SEQUENCE
阻塞并发nextval
、 currval
、lastval
和 setval
调用。
由于历史原因,ALTER TABLE
也可以被用于序列, 但是只有等效于上述形式的ALTER TABLE
变体才被允许用于序列。
示例
在 105 重启一个被称为serial
的序列:
ALTER SEQUENCE serial RESTART WITH 105;