PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

ALTER SEQUENCE

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

Synopsis

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 更改该序列的数据类型。有效类型是 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 作为默认值。如果两个选项都未指定,将保持当前的最大值。

CYCLE

可选关键字 CYCLE 可用于允许序列在递增序列到达 maxvalue 或递减序列到达 minvalue 时进行循环。如果到达了限制值,下一个生成的数字将分别是 minvalue 或 maxvalue。

NO CYCLE

如果指定了可选关键字 NO CYCLE,在该序列到达其最大值之后,任何对 nextval 的调用都将返回错误。如果既未指定 CYCLE 也未指定 NO CYCLE,将保持原有的循环行为。

start

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

restart

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

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

cache

子句 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 会阻塞并发的 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 的扩展。

另请参阅

CREATE SEQUENCE, DROP SEQUENCE