

# `ALTER SEQUENCE`
<a name="alter-sequence-syntax-support"></a>

`ALTER SEQUENCE`：更改序列生成器的定义。

**重要**  
使用序列时，应谨慎考虑缓存值。有关更多信息，请参阅 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 页面上的“重要提示”标注。  
有关如何根据工作负载模式以最佳方式使用序列的指导，请参阅[使用序列和标识列](sequences-identity-columns-working-with.md)。

## 支持的语法
<a name="alter-sequence-supported-syntax"></a>

```
ALTER SEQUENCE [ IF EXISTS ] name
    [ 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 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

where cache is 1 or cache >= 65536
```

## 说明
<a name="alter-sequence-description"></a>

`ALTER SEQUENCE` 更改现有序列生成器的参数。`ALTER SEQUENCE` 命令中未特别设置的任何参数都将保留其先前的设置。

您必须拥有该序列的所有权才能使用 `ALTER SEQUENCE`。要更改序列的架构，您还必须对新架构具有 `CREATE` 权限。要更改所有者，您必须能够 `SET ROLE` 以使用新的拥有角色，并且该角色必须对序列的架构拥有 `CREATE` 权限。（这些限制强制要求：更改所有者不会执行任何您无法通过删除并重新创建序列来完成的事情。但是，无论如何，超级用户都可以更改任何序列的所有权。）

## 参数
<a name="alter-sequence-parameters"></a>

***name***  
要更改的序列的名称（可选择架构限定）。

**`IF EXISTS`**  
如果序列不存在，不引发错误。在这种情况下，将发出通知。

***INCREMENT***  
子句 `INCREMENT BY increment` 是可选的。正值将生成升序序列，负值将生成降序序列。如果未指定，将保留旧的增量值。

***minvalue*/`NO MINVALUE`**  
可选子句 `MINVALUE minvalue` 确定序列可以生成的最小值。如果指定了 `NO MINVALUE`，则将分别对升序序列和降序序列使用默认值 1 和数据类型的最小值。如果两个选项都未指定，则将保持当前的最小值。

***maxvalue*/`NO MAXVALUE`**  
可选子句 `MAXVALUE maxvalue` 确定序列的最大值。如果指定了 `NO MAXVALUE`，则将分别使用数据类型的最大值（对于升序序列）和 -1（对于降序序列）作为默认值。如果两个选项都未指定，则将保持当前的最大值。

**`CYCLE`**  
当升序降序或降序序列分别达到 *maxvalue* 或 *minvalue* 时，可以使用可选的 `CYCLE` 关键字来使序列循环。如果达到限制，则生成的下一个数字将分别是 *minvalue* 或 *maxvalue*。

**`NO CYCLE`**  
如果指定了可选的 `NO CYCLE` 关键字，则在序列达到其最大值之后对 `nextval` 的任何调用都将返回错误。如果 `CYCLE` 或 `NO CYCLE` 都未指定，则将保持旧的循环行为。

***开启***  
可选子句 `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 cache` 支持预分配序列号并将其存储在内存中，以便更快地进行访问。该值必须为 1 或某个 >= 65536 的值。如果未指定，将保留旧的缓存值。有关缓存行为的更多信息，请参阅 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 下的指南。

**`OWNED BY table_name.column_name` / `OWNED BY NONE`**  
`OWNED BY` 选项使序列与特定的表列相关联，这样，如果删除该列（或其整个表），也将自动删除该序列。如果指定，则此关联将替换先前为序列指定的任何关联。指定的表必须与序列具有相同的所有者，并且与序列处于相同的架构中。指定 `OWNED BY NONE` 会移除任何现有的关联，使序列变为“独立的”。

***new\$1owner***  
序列的新所有者的用户名。

***new\$1name***  
序列的新名称。

***new\$1schema***  
序列的新架构。

## 备注
<a name="alter-sequence-notes"></a>

`ALTER SEQUENCE` 不会立即影响具有预分配（缓存）序列值的后端（当前后端除外）中的 `nextval` 结果。在注意到更改的序列生成参数之前，它们将用完所有缓存的值。当前后端将立即受到影响。

`ALTER SEQUENCE` 不会影响序列的 `currval` 状态。

`ALTER SEQUENCE` 可能会导致 OCC 发生其它事务。

出于历史原因，`ALTER TABLE` 也可以与序列一起使用；但仅支持与上述格式等效的 `ALTER TABLE` 变体用于序列。

## 示例
<a name="alter-sequence-examples"></a>

在 105 处重新启动一个名为 `serial` 的序列：

```
ALTER SEQUENCE serial RESTART WITH 105;
```

## 兼容性
<a name="alter-sequence-compatibility"></a>

`ALTER SEQUENCE` 符合 SQL 标准，但 `AS`、`START WITH`、`OWNED BY`、`OWNER TO`、`RENAME TO` 和 `SET SCHEMA` 子句除外，它们是 PostgreSQL 扩展。