ALTER SEQUENCE¶
说明¶
修改序列
语法¶
alter_sequence ::=
restart_option ::=
increment_option ::=
maxvalue_option ::=
minvalue_option ::=
cycle_option ::=
cache_option ::=
order_option ::=
参数¶
IF EXISTS
修改序列时,若存在同名序列则进行修改,否则会跳过操作,且会打印NOTICE提示信息
seqname
要修改的序列的名字。
increment
序列每次增长数。
使用正数序列递增,使用负数序列递减。
不允许使用0.
如果没有声明,将沿用原来的增长数。
MINVALUE minvalue
NO MINVALUE
指定序列可生成的最小的值,该值应当不大于序列的当前值(或restart值)。
如果声明了NO MINVALUE,那么将使用缺省值,递增序列为1递减序列为-9223372036854775808。
如果没有声明则沿用当前的最小值。
MAXVALUE maxvalue
NO MAXVALUE
指定序列可生成的最大值。该值应当不小于序列的当前值(或restart值)。
如果声明了NO MAXVALUE,那么将使用缺省值,递增序列为9223372036854775807,递减序列为-1。
如果没有声明则沿用当前的最大值。
RESTART restart
重新指定序列初始值。
CACHE cache
NO CACHE
指定每次序列号预分配的数量。
如果声明了NO CACHE,则不使用序列缓存,相当于CACHE 1。
如果没有声明则沿用原来的cache值。
CYCLE
序列号达到最大值(序列递增)或最小值(序列递减)时可复位并继续下去。
序列号达到最大值(序列递增)时,生成的下一个数据是最小值。
序列号达到最小值(序列递减)时,生成的下一个数据是最大值。
NO CYCLE
序列号达到最大值(序列递增)或最小值(序列递减)时,再获取下一个序列号将返回错误。
ORDER
该选项暂未实现,使用时将被忽略。
注解
任何没有明确在ALTER SEQUENCE命令里声明的参数都将保留原先的设置。
要使用ALTER SEQUENCE,用户必须是序列的拥有者(owner)。
序列是基于bigint运算的,因此其范围不能超过八字节的整数范围(- 9223372036854775808 到 9223372036854775807)。
除本session外,ALTER SEQUENCE将不会立即影响其他session的nextval结果,因为它们可能有已经缓存了的序列号。它们只有在使用光所有已经缓存的序列号之后才能意识到改变了的序列参数。当前session将立即被影响。(参考示例)
ALTER SEQUENCE不影响序列的currval状态。(参考示例)
ALTER SEQUENCE RESTART后,可能会使没有使用过该序列的session中的序列处于未定义状态。(参考示例)
在一个ALTER SEQUENCE语句中,同一类选项参数不能重复出现,例如,不能同时指定CYCLE和NO CYCLE选项。(参考示例)
应当尽量使用BY和WITH关键字,保持与SQL标准一致。
示例¶
示例1: 重新指定序列初始值
-- 清理环境
DROP SEQUENCE seq1 CASCADE;
-- 创建序列
CREATE SEQUENCE seq1 START WITH 33;
-- 查询下一序列值
SELECT nextval('seq1');
NEXTVAL(bigint) |
---------------------
33 |
总数目:1
-- 查询当前序列值
SELECT currval('seq1');
CURRVAL(bigint) |
---------------------
33 |
总数目:1
-- 重新指定序列初始值
ALTER SEQUENCE seq1 RESTART WITH 5;
-- 查询当前序列值 —— currval 不受影响
SELECT currval('seq1');
CURRVAL(bigint) |
---------------------
33 |
总数目:1
-- 查询下一序列值 —— 已修改为 5
SELECT nextval('seq1');
NEXTVAL(bigint) |
---------------------
5 |
总数目:1
-- 查询当前序列值 —— 已修改为 5
SELECT currval('seq1');
CURRVAL(bigint) |
---------------------
5 |
总数目:1
-- 删除序列
DROP SEQUENCE seq1;
-- 序列不存在时,修改序列
-- 使用 IF EXISTS 时,跳过操作,不报错
ALTER SEQUENCE IF EXISTS seq1 RESTART WITH 5;
-- 不使用 IF EXISTS 时,语句报错
ALTER SEQUENCE seq1 RESTART WITH 5;
ERROR, 序列不存在, sequence "SEQ1" does not exist
示例2: 重新指定序列增长数
-- 清理环境
DROP SEQUENCE seq2 CASCADE;
-- 创建序列
CREATE SEQUENCE seq2 INCREMENT BY 1;
-- 查询下一序列值
SELECT nextval('seq2');
NEXTVAL(bigint) |
---------------------
1 |
总数目:1
-- 查询当前序列值 —— 步进 1
SELECT nextval('seq2');
NEXTVAL(bigint) |
---------------------
2 |
总数目:1
-- 重新指定序列增长数
ALTER SEQUENCE seq2 INCREMENT BY 5;
-- 查询当前序列值 —— currval 不受影响
SELECT currval('seq2');
CURRVAL(bigint) |
---------------------
2 |
总数目:1
-- 查询下一序列值 —— 步进 5
SELECT nextval('seq2');
NEXTVAL(bigint) |
---------------------
7 |
总数目:1
-- 查询下一序列值 —— 步进 5
SELECT nextval('seq2');
NEXTVAL(bigint) |
---------------------
12 |
总数目:1
-- 删除序列
DROP SEQUENCE seq2;
示例3: 同类参数不能重复出现
-- 清理环境
DROP SEQUENCE seq3 CASCADE;
-- 创建序列
CREATE SEQUENCE seq3 INCREMENT BY 1;
-- 同类参数不能重复出现
ALTER SEQUENCE seq3 CYCLE NO CYCLE;
ERROR, 序列值参数非法, 冲突或多余的选项:cycle
-- 删除序列
DROP SEQUENCE seq3;
示例4: 缓存给修改序列带来的延迟
-- 清理环境
DROP SEQUENCE seq4 CASCADE;
-- 创建一个序列, 初始值为 10, 增长数为 1, 缓存为 3
CREATE SEQUENCE seq4 START WITH 10 INCREMENT BY 1 CACHE 3;
-- session 1 查询下一序列值
SELECT nextval('seq4');
NEXTVAL(bigint) |
---------------------
10 |
总数目:1
-- session 2 将增长数修改为 2
[2] ALTER SEQUENCE seq4 INCREMENT BY 2;
-- session1 查询下一个序列值, 发现增长数依然为1,
-- 直到用完缓存中剩余的 2 个序列号
SELECT nextval('seq4');
NEXTVAL(bigint) |
---------------------
11 |
总数目:1
SELECT nextval('seq4');
NEXTVAL(bigint) |
---------------------
12 |
总数目:1
SELECT nextval('seq4');
NEXTVAL(bigint) |
---------------------
14 |
总数目:1
SELECT nextval('seq4');
NEXTVAL(bigint) |
---------------------
16 |
总数目:1
-- 删除序列
DROP SEQUENCE seq4;
示例5: RESTART 使序列处于未定义状态
-- 清理环境
DROP SEQUENCE seq5 CASCADE;
-- 创建序列
CREATE SEQUENCE seq5;
-- session 1 调用 nextval 使序列处于已定义状态
SELECT nextval('seq5');
NEXTVAL(bigint) |
---------------------
1 |
总数目:1
SELECT currval('seq5');
CURRVAL(bigint) |
---------------------
1 |
总数目:1
-- session 2 重新指定序列初始值
[2] ALTER SEQUENCE seq5 RESTART WITH 10;
-- session 2 以前没有调用过 nextval 或 currval
-- 此时调用 currval 发现序列处于未定义状态, 需要先调用 nextval
[2] SELECT currval('seq5');
ERROR, 当前SESSION还没有得到序列的当前值, 请先调用nextval或者setval,序列名为SEQ5
[2] SELECT nextval('seq5');
NEXTVAL(bigint) |
---------------------
10 |
总数目:1
[2] SELECT currval('seq5');
CURRVAL(bigint) |
---------------------
10 |
总数目:1
-- 删除序列
DROP SEQUENCE seq5;