ALTER SEQUENCE
ALTER SEQUENCE — 更改序列生成器的定义
语法
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 SET { LOGGED | UNLOGGED }
ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
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
权限。要更改所有者,您必须能够将SET ROLE
设置为新的所有者角色,并且该角色必须对序列的架构拥有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
,则将保留旧的循环行为。SET { LOGGED | UNLOGGED }
此表单将序列从未记录更改为已记录或反之亦然(请参阅 CREATE SEQUENCE)。它不能应用于临时序列。
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
状态。(在PostgreSQL8.3 之前,它有时会这样做。)
ALTER SEQUENCE
阻止并发nextval
、currval
、lastval
和setval
调用。
由于历史原因,ALTER TABLE
也可以与序列一起使用;但ALTER TABLE
允许与序列一起使用的唯一变体等同于上面显示的表单。
示例
重新启动一个名为serial
的序列,从 105 开始
ALTER SEQUENCE serial RESTART WITH 105;
兼容性
ALTER SEQUENCE
符合SQL标准,但AS
、START WITH
、OWNED BY
、OWNER TO
、RENAME TO
和SET SCHEMA
子句除外,它们是PostgreSQL扩展。