2025年9月25日: PostgreSQL 18 发布!
支持版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

ALTER SEQUENCE

ALTER SEQUENCE — 更改序列生成器的定义

概要

ALTER SEQUENCE [ IF EXISTS ] name
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ [ NO ] CYCLE ]
    [ START [ WITH ] start ]
    [ RESTART [ [ WITH ] restart ] ]
    [ CACHE cache ]
    [ 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 更改序列的数据类型。有效类型为 smallintintegerbigint

数据类型的更改会自动更改序列的最小值和最大值,仅当先前的最小值和最大值是旧数据类型的最小值或最大值时(换句话说,如果序列是使用 NO MINVALUENO MAXVALUE 创建的,无论是隐式还是显式)。否则,最小值和最大值将得以保留,除非在同一命令中提供了新值。如果最小值和最大值不适合新数据类型,将生成错误。

递增量

子句 INCREMENT BY increment 是可选的。正值将创建升序序列,负值将创建降序序列。如果未指定,则将保持旧的递增值。

minvalue
NO MINVALUE

可选子句 MINVALUE minvalue 确定序列可以生成的最小值。如果指定了 NO MINVALUE,则升序和降序序列将分别使用 1 和数据类型的最小值作为默认值。如果未指定这两个选项中的任何一个,则将保持当前的最小值。

maxvalue
NO MAXVALUE

可选子句 MAXVALUE maxvalue 确定序列的最大值。如果指定了 NO MAXVALUE,则升序和降序序列将分别使用数据类型的最大值和 -1 作为默认值。如果未指定这两个选项中的任何一个,则将保持当前的最大值。

CYCLE

可选关键字 CYCLE 可用于启用序列在升序序列达到 maxvalue 或降序序列达到 minvalue 时进行循环。如果达到限制,下一个生成的数字将分别是 minvaluemaxvalue

NO CYCLE

如果指定了可选关键字 NO CYCLE,那么在序列达到最大值后调用 nextval 将会返回错误。如果未指定 CYCLENO CYCLE,则将保持旧的循环行为。

start

可选子句 START WITH start 更改序列记录的起始值。这不会影响 当前 序列值;它只是设置未来 ALTER SEQUENCE RESTART 命令将使用的值。

重启

可选子句 RESTART [ WITH restart ] 更改序列的当前值。这类似于使用 is_called = false 调用 setval 函数:指定的值将由 nextval下一次 调用返回。编写不带 restart 值的 RESTART 等同于提供由 CREATE SEQUENCE 记录或上次由 ALTER SEQUENCE START WITH 设置的起始值。

setval 调用相比,对序列执行 RESTART 操作是事务性的,并且会阻止并发事务从同一序列获取数字。如果这不是期望的操作模式,则应使用 setval

缓存

子句 CACHE cache 允许预先分配序列号并将其存储在内存中以加快访问速度。最小值是 1(一次只能生成一个值,即无缓存)。如果未指定,则将保持旧的缓存值。

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 状态。(在 PostgreSQL 8.3 之前,它有时会。)

ALTER SEQUENCE 会阻止并发的 nextvalcurrvallastvalsetval 调用。

出于历史原因,ALTER TABLE 也可以与序列一起使用;但是,ALTER TABLE 允许与序列一起使用的唯一形式等同于上述形式。

示例

重启名为 serial 的序列,设置为 105

ALTER SEQUENCE serial RESTART WITH 105;

兼容性

ALTER SEQUENCE 符合SQL标准,除了 ASSTART WITHOWNED BYOWNER TORENAME TOSET SCHEMA 子句,这些是 PostgreSQL 的扩展。

提交更正

如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。