ALTER SEQUENCE

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

Synopsis

ALTER SEQUENCE [ IF EXISTS ] name
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ]
    [ RESTART [ [ WITH ] restart ] ]
    [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]
    [ NOORDER ]
    [ ORDER ]
    [ NOCACHE ]
    [ NOCYCLE ]
    [ NOMAXVALUE ]
ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | 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特权。要更改拥有者,你还必须 是新拥有角色的一个直接或者间接成员,并且该角色必须具有该域的模式上的 CREATE特权(这些限制强制修改拥有者不能做一些通过删除和重 建该序列做不到的事情。不过,一个超级用户怎么都能更改任何序列的所有权。)。

参数

name

要修改的序列的名称(可以是模式限定的)。

IF EXISTS

在序列不存在时不要抛出一个错误。这种情况下会发出一个提示。

data_type

可选子句AS data_type 改变序列的数据类型。有效类型是smallintintegerbigint

当且仅当先前的最小值和最大值是旧数据类型的最小值或最大值时(换句话说, 如果序列是使用NO MINVALUENO MAXVALUE, 隐式或显式创建的),则更改数据类型会自动更改序列的最小值和最大值。 否则,将保留最小值和最大值,除非将新值作为同一命令的一部分给出。 如果最小值和最大值不符合新的数据类型,则会生成错误。

increment

子句INCREMENT BY increment是可选的。 一个正值将产生一个上升序列,一个负值会产生一个下降序列。如果 没有指定,旧的增量值将被保持。

minvalue
NO MINVALUE

可选的子句MINVALUE minvalue决定一个序列 能产生的最小值。如果指定了NO MINVALUE,上升序列和下降序列的默认值分别是 1 和 数据类型的最小值。如果这些选项都没有被指定,将保持当前的 最小值。

如果minvalue的值小于INT64_MIN(-9223372036854775808),则设置minvaluesequence类型所对应的最小值。 这个功能仅在Oracle兼容模式下生效。

maxvalue
NO MAXVALUE

可选的子句MAXVALUE maxvalue决定一个序列 能产生的最大值。如果指定了NO MAXVALUE,上升序列和下降序列的默认值分别是 数据类型的最大值和 -1。如果这些选项都没有被指定,将保持当前的 最大值。

如果maxvalue的值大于INT64_MAX(9223372036854775807),则设置maxvaluesequence类型所对应的最大值。 这个功能仅在Oracle兼容模式下生效。

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 cache使得序列数字被预先 分配并且保存在内存中以便更快的访问。最小值是 1(每次只产生一个值,即 无缓存)。如果没有指定,旧的缓冲值将被保持。注意在Oracle兼容模式下, 为了尽可能保证序列值的连续性,当cache值被设置为大于1的值时,将自动设 置cache值为1。

CYCLE

可选的CYCLE关键词可以被用来允许该序列在达到 maxvalue(上升序列)或 minvalue(下降序列)时 回卷。如果到达该限制,下一个被产生的数字将分别是 minvalue或者 maxvalue

NO CYCLE

如果指定了可选的NO CYCLE关键词,任何在该 序列到达其最大值后的nextval调用将会返回 一个错误。如果既没有指定CYCLE也没有指定 NO CYCLE,旧的循环行为将被保持。

OWNED BY table_name.column_name
OWNED BY NONE

OWNED BY选项导致该序列与一个特定的表列相关联, 这样如果该列(或者整个表)被删除,该序列也会被自动删除。如果指定, 这种关联会替代之前为该序列指定的任何关联。被指定的表必须具有相同的 拥有者并且与该序列在同一个模式中。指定 OWNED BY NONE可以移除任何现有的关联,让该序列 自立

NOORDER
ORDER
NOCACHE
NOCYCLE

为了兼容Oracle数据库语法,ALTER SEQUENCE语句支持 NOORDER/ORDER/NOCACHE/NOCYCLE 关键字。这些关键字仅是语法糖。

new_owner

该序列的新拥有者的用户名。

new_name

该序列的新名称。

new_schema

该序列的新模式。

NOMAXVALUE

为了兼容Oracle数据库语法,ALTER SEQUENCE语句支持 NOMAXVALUE 关键字。内部逻辑和NO MAXVALUE相同。

注解

ALTER SEQUENCE将不会立即影响除当前后端外 其他后端中的nextval结果,因为它们有预分配(缓存)的序列 值。在注意到序列生成参数被更改之前它们将用尽所有缓存的值。当前后端将被 立刻影响。

ALTER SEQUENCE不会影响该序列的 currval状态(在 LightDB 8.3 之前有时会影响)。

ALTER SEQUENCE阻塞并发nextvalcurrvallastvalsetval调用。

由于历史原因,ALTER TABLE也可以被用于序列, 但是只有等效于上述形式的ALTER TABLE变体才被 允许用于序列。

示例

在 105 重启一个被称为serial的序列:

ALTER SEQUENCE serial RESTART WITH 105;

使用ORDER/NOORDER/NOCACHE/NOCYCLE选项来修改sequence。

alter sequence lt_seq_test1 nocache nocycle noorder;
alter sequence lt_seq_test1 order nocycle nocache;

兼容性

ALTER SEQUENCE符合SQL 标准,不过ASSTART WITHOWNED BYOWNER TORENAME TO 以及SET SCHEMA子句是 LightDB扩展。

另见

CREATE SEQUENCE, DROP SEQUENCE