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
SET { LOGGED | UNLOGGED } ALTER SEQUENCE [ IF EXISTS ]name
OWNER TO {new_owner
| CURRENT_ROLE | 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
权限。要更改所有者,您必须能够将 SET ROLE
设置为新的所有者角色,并且该角色必须对序列架构具有 CREATE
权限。(这些限制强制确保更改所有者不会执行通过删除和重新创建序列无法执行的任何操作。但是,无论如何,超级用户都可以更改任何序列的所有权。)
name
要更改的序列的名称(可选择指定架构)。
IF EXISTS
如果序列不存在,则不抛出错误。在这种情况下,将 issuing 通知。
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
状态。(在 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 扩展。