SQL COMMAND · 表与视图
ALTER SEQUENCE
更改序列发生器的定义
change the definition of a sequence generator
ALTER表与视图引入 7.4现存至 20 devel10 次语法变更
- 动词
ALTER- 对象
SEQUENCE- 分组
- 表与视图
- 引入版本
- 7.4
- 状态
- 现存
- 语法变更次数
- 10
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17:语法概要新增 2 行,移除 1 行。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
ALTER SEQUENCE · 语法 2
ALTER SEQUENCE · 语法 3
ALTER SEQUENCE · 语法 4
ALTER SEQUENCE · 语法 5
语法概要
相对 PostgreSQL 17 新增 2 行,移除 1 行;新增行以绿色标记。
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
查看移除的 1 行
− [ CACHE cache ] [ [ NO ] CYCLE ]
描述
ALTER SEQUENCE 更改现有序列发生器的参数。在
ALTER SEQUENCE 命令中未明确设置的参数,会保留其原有设置。
要使用 ALTER SEQUENCE,你必须拥有该序列。要更改序列所在的模式,你还必须在新模式上具有 CREATE 权限。要更改拥有者,你必须能够对新的拥有角色执行
SET ROLE,并且该角色必须在该序列所在模式上具有 CREATE 权限。(这些限制确保更改拥有者不会做出任何你不能通过删除并重建该序列来完成的事情。不过,超级用户无论如何都可以更改任何序列的所有权。)
参数
name要更改的序列名称(可以是模式限定的)。
IF EXISTS如果该序列不存在,则不要抛出错误。这种情况下会发出一条提示。
data_type可选子句
AS更改序列的数据类型。有效类型是data_typesmallint、integer和bigint。当且仅当此前的最小值和最大值就是旧数据类型的最小值或最大值时,更改数据类型才会自动更改序列的最小值和最大值(换句话说,如果该序列在创建时隐式或显式使用了
NO MINVALUE或NO MAXVALUE)。否则,最小值和最大值会被保留,除非在同一条命令中给出了新值。如果最小值和最大值无法适配新数据类型,则会产生错误。increment子句
INCREMENT BY是可选的。正值使序列递增,负值使序列递减。如果未指定,则保留原有的增量值。incrementminvalueNO MINVALUE可选子句
MINVALUE确定序列可生成的最小值。如果指定了minvalueNO MINVALUE,则升序序列和降序序列将分别使用默认值 1 和该数据类型的最小值。如果两种选项都未指定,则保留当前最小值。maxvalueNO MAXVALUE可选子句
MAXVALUE确定序列的最大值。如果指定了maxvalueNO MAXVALUE,则升序序列和降序序列将分别使用该数据类型的最大值和默认值 -1。如果两种选项都未指定,则保留当前最大值。CYCLE可选关键字
CYCLE可用于让序列在升序序列达到maxvalue、或降序序列达到minvalue时回绕。达到限制后,下一个生成的数字将分别是minvalue或maxvalue。NO CYCLE如果指定了可选关键字
NO CYCLE,则当序列达到其最大值后,任何对nextval的调用都会返回错误。如果既未指定CYCLE也未指定NO CYCLE,则保留原有的循环行为。start可选子句
START WITH更改序列记录的起始值。这不会影响当前序列值;它只是设置未来startALTER 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(一次只能生成一个值,也就是不使用缓存)。如果未指定,则保留原有的缓存值。cacheSET { LOGGED | UNLOGGED }这种形式将序列从不记录 WAL 改为记录 WAL,或反之亦然(见 CREATE SEQUENCE)。它不能应用于临时序列。
OWNED BYtable_name.column_nameOWNED BY NONEOWNED 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 扩展。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 18← 17语法变化
+ [ [ NO ] CYCLE ]+ [ START [ WITH ] start ]− [ CACHE cache ] [ [ NO ] CYCLE ]正文更新PostgreSQL 16← 15正文更新
正文更新PostgreSQL 15← 14语法变化
+ ALTER SEQUENCE [ IF EXISTS ] name SET { LOGGED | UNLOGGED }+ ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }正文更新PostgreSQL 14← 13语法变化
+ ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }PostgreSQL 10← 9.6语法变化
+ [ AS data_type ]正文更新PostgreSQL 9.5← 9.4语法变化
+ ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }PostgreSQL 9.2← 9.1语法变化
+ ALTER SEQUENCE [ IF EXISTS ] name [ INCREMENT [ BY ] increment ]+ [ OWNED BY { table_name.column_name | NONE } ]+ ALTER SEQUENCE [ IF EXISTS ] name OWNER TO new_owner+ ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name+ ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema− [ OWNED BY { table.column | NONE } ]正文更新PostgreSQL 8.4← 8.3语法变化
+ [ START [ WITH ] start ]+ [ RESTART [ [ WITH ] restart ] ]+ ALTER SEQUENCE name OWNER TO new_owner+ ALTER SEQUENCE name RENAME TO new_name− [ RESTART [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]正文更新PostgreSQL 8.3← 8.2语法变化
+ ALTER SEQUENCE name RENAME TO new_name+ ALTER SEQUENCE name SET SCHEMA new_schema正文更新PostgreSQL 8.2← 8.1语法变化
+ [ OWNED BY { table.column | NONE } ]正文更新PostgreSQL 8.1← 8.0语法变化
+ ALTER SEQUENCE name SET SCHEMA new_schema正文更新PostgreSQL 8.0← 7.4正文更新
正文更新PostgreSQL 7.4← 7.3新增此命令
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
TRUNCATE | TRUNCATE | — | 8.43 次 | |
| 清空一个表或一组表 | 现存 | |||
CREATE MATERIALIZED VIEW | CREATE | MATERIALIZED VIEW | 122 次 | |
| 定义一个新物化视图 | 现存 | |||
ALTER MATERIALIZED VIEW | ALTER | MATERIALIZED VIEW | 168 次 | |
| 更改一个物化视图的定义 | 现存 | |||
DROP MATERIALIZED VIEW | DROP | MATERIALIZED VIEW | — | |
| 移除一个物化视图 | 现存 | |||
REFRESH MATERIALIZED VIEW | REFRESH | MATERIALIZED VIEW | 9.41 次 | |
| 替换物化视图的内容 | 现存 | |||
CREATE SEQUENCE | CREATE | SEQUENCE | 188 次 | |
| 定义一个新的序列发生器 | 现存 | |||
ALTER SEQUENCE | ALTER | SEQUENCE | 1810 次 | |
| 更改序列发生器的定义 | 现存 | |||
DROP SEQUENCE | DROP | SEQUENCE | 8.23 次 | |
| 移除一个序列 | 现存 | |||
CREATE TABLE | CREATE | TABLE | 1920 次 | |
| 定义一个新表 | 现存 | |||
ALTER TABLE | ALTER | TABLE | 1826 次 | |
| 更改一个表的定义 | 现存 | |||
DROP TABLE | DROP | TABLE | 8.23 次 | |
| 移除一个表 | 现存 | |||
CREATE TABLE AS | CREATE | TABLE AS | 1911 次 | |
| 根据查询结果定义一个新表 | 现存 | |||
CREATE VIEW | CREATE | VIEW | 9.47 次 | |
| 定义一个新视图 | 现存 | |||
ALTER VIEW | ALTER | VIEW | 145 次 | |
| 更改视图的定义 | 现存 | |||
DROP VIEW | DROP | VIEW | 8.24 次 | |
| 移除一个视图 | 现存 | |||