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 } ] [ NOORDER ] [ ORDER ] [ NOCACHE ] [ NOCYCLE ] [ NOMAXVALUE ] ALTER SEQUENCE [ IF EXISTS ]name
OWNER TO {new_owner
| 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
特权。要更改拥有者,你还必须
是新拥有角色的一个直接或者间接成员,并且该角色必须具有该域的模式上的
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 和
数据类型的最小值。如果这些选项都没有被指定,将保持当前的
最小值。
如果minvalue
的值小于INT64_MIN
(-9223372036854775808),则设置minvalue
为sequence
类型所对应的最小值。
这个功能仅在Oracle兼容模式下生效。
maxvalue
NO MAXVALUE
可选的子句MAXVALUE
决定一个序列
能产生的最大值。如果指定了maxvalue
NO
MAXVALUE
,上升序列和下降序列的默认值分别是
数据类型的最大值和 -1。如果这些选项都没有被指定,将保持当前的
最大值。
如果maxvalue
的值大于INT64_MAX
(9223372036854775807),则设置maxvalue
为sequence
类型所对应的最大值。
这个功能仅在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
使得序列数字被预先
分配并且保存在内存中以便更快的访问。最小值是 1(每次只产生一个值,即
无缓存)。如果没有指定,旧的缓冲值将被保持。注意在Oracle兼容模式下,
为了尽可能保证序列值的连续性,当cache值被设置为大于1的值时,将自动设
置cache值为1。
cache
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
阻塞并发nextval
、
currval
、lastval
和
setval
调用。
由于历史原因,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
标准,不过AS
、START WITH
、
OWNED BY
、OWNER TO
、RENAME TO
以及SET SCHEMA
子句是
LightDB扩展。