SEQUENCE概述
CREATE SEQUENCE
CREATE SEQUENCE语句用于在数据库中创建一个新序列。使用序列自动增加表中的整数。
任何用户拥有新建序列所属模式的CREATE权限,即可执行创建新序列的操作。创建成功后,root用户拥有该序列的全部权限:DROP,SELECT,USAGE,UPDATE权限。当创建用户不是root用户时,则除root角色外,用户也同样拥有新建序列的全部权限。
注意:
- 使用序列比使用UUID,BYTES或SERIAL数据类型自动生成唯一ID要慢。 增加序列需要写入持久存储,而自动生成唯一ID则不需要。 因此,若非必须,否则请使用自动生成的唯一ID。
- 如果事务使序列递增后回滚,则使用序列的列可能在序列值中出现缺口。 序列更新会立即提交,并且不会与其包含的事务一起回滚。 这样做是为了避免阻塞使用相同序列的并发事务。
- 用户必须具有父数据库的CREATE特权。
语法格式
CREATE SEQUENCE的语法格式如下:
- INCREMENT
- MINVALUE
序列的最小值。如果未指定或输入,则应用默认值NO MINVALUE。
默认为升序: 1。默认为降序: MININT。
- MAXVALUE
序列的最大值。如果未指定或输入,则应用默认值NO MAXVALUE。
默认为升序: MAXINT。默认为降序: -1。
- START
序列的第一个值。默认为升序: 1。默认为降序: -1。
- NO CYCLE
当前,所有序列都设置为,NO CYCLE并且该序列不会自动换行。
参数说明
- opt_temp
temp/temporary,该参数表明创建的视图为临时序列,其他session无权访问,使用时优先级高于同名的普通sequence。临时序列会在session退出时删除。
- sequence_name
要创建的序列的名称,在数据库中必须是唯一的,并且要遵循标识符规则。如果父数据库未设置为默认数据库,则名称的格式必须为database.seq_name。\
- integer
整数值。
语法示例
示例1:列出所有序列。
SELECT * FROM information_schema.sequences;
sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
示例2:使用默认设置创建序列。
CREATE SEQUENCE customer_seq;
CREATE SEQUENCE
SHOW CREATE customer_seq;
table_name | create_statement
+———————+—————————————————————————————————————————————+
customer_seq | CREATE SEQUENCE customer_seq MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1
示例3:使用用户自定义设置创建序列。
CREATE SEQUENCE customer_seq;
CREATE SEQUENCE desc_customer_list START -1 INCREMENT -2;
CREATE SEQUENCE
SHOW CREATE desc_customer_list;
table_name | create_statement
+——————————+——————————————————————————————————————————————————+
desc_customer_list | CREATE SEQUENCE desc_customer_list MINVALUE -9223372036854775808 MAXVALUE -1 INCREMENT -2 START -1
示例4:使用序列创建表。
示例5:查看序列的当前值。
要查看当前值而不增加顺序,请使用:
SELECT * FROM customer_seq;
last_value | log_cnt | is_called
+——————+————-+—————-+
3 | 0 | true
(1 row) |
如果从当前会话中的序列中获得了一个值,则还可以使用该currval(‘seq_name’)函数来获取最近获得的值:
SELECT currval(‘customer_seq’);
currval
+————-+
3
SHOW SEQUENCES
SHOW SEQUENCES可显示目标数据库下的序列(如未指定数据库则默认为当前数据库)。用户拥有目标数据库下的序列的任意权限,即可显示。
语法格式
SHOW SEQUENCES的语法格式如下:
- name
要为其列出序列的数据库的名称。如果省略,则会列出当前数据库中的序列。
语法示例
示例1:列出当前数据库中的序列。
CREATE SEQUENCE sequence_test;
CREATE SEQUENCE
SHOW SEQUENCES;
sequence_name
+——————————+
customer_seq desc_customer_list sequence_test
ALTER SEQUENCE
ALTER SEQUENCE 语句用于更改序列的名称,增量值和其他设置。
序列的重命名支持跨数据库库迁移操作,即重命名后的序列可迁移到新的数据库中。当没有对象依赖于目标序列时,任何用户拥有序列重命名后所属模式的CREATE权限、重命名前原序列的DROP权限时,即可执行重命名目标序列的操作。修改成功后,该用户拥有重命名序列的全部权限:USAGE,DROP,SELECT,UPDATE权限,且其他用户保留对该模式和其下对的原有权限。
任何用户拥有目标序列的DROP权限和所属模式的CREATE权限,即可执行更改目标序列的增量值。任何用户拥有目标序列的UPDATE权限,即可执行设置目标序列的下一个值(SELECT setval)。修改成功后,所有用户保留对该序列的原有权限。
语法格式
修改序列的语法格式如下:
如果加上IF EXISTS关键字则仅当序列存在时才对其进行修改;如果不存在,则不返回错误。
序列递增的新值。负数会创建一个降序。正数会创建一个升序。
- MINVALUE
序列的新最小值。默认值:1。
- MAXVALUE
序列的新最大值。默认值:9223372036854775807。
- START
当你RESTART或者当序列达到MAXVALUE并且设置了CYCLE时sequence的值。RESTART 和 CYCLE 尚未实现。
- CYCLE
当sequence值达到最大值或者最小值时,将会循环开始. 如果设置了 NO CYCLE则不会。
- VIRTUAL
暂时不知道。
参数说明
- sequence_name
- integer
整数值。
语法示例
示例1:更改序列的增量值。
在此示例中,将序列的增量值从其当前状态1更改为2。
ALTER SEQUENCE customer_seq INCREMENT 2;
ALTER SEQUENCE
接下来,将另一个记录添加到表中,并检查新记录是否符合新序列。
INSERT INTO customer_list (customer, address) VALUES (‘Marie’, ‘333 Ocean Ave’);
INSERT 1
SELECT * FROM customer_list;
id | customer | address
+——+—————+——————————+
1 | Lauren | 123 Main Street
2 | Jesse | 456 Broad Ave
3 | Amruta | 9876 Green Parkway
5 | Marie | 333 Ocean Ave
示例2:设置序列的下一个值。
在此示例中,更改示例序列(customer_seq)的下一个值。当前,下一个值将是7(即5+ INCREMENT 2)。我们将下一个值更改为20。
注意:不能在MAXVALUE或MINVALUE序列之外设置值。
SELECT setval(‘customer_seq’, 20, false);
setval
+————+
20
将另一个记录添加到表中,以检查新记录是否符合新的下一个值。
INSERT INTO customer_list (customer, address) VALUES (‘Lola’, ‘333 Schermerhorn’);
INSERT 1
SELECT * FROM customer_list;
id | customer | address
+——+—————+——————————+
1 | Lauren | 123 Main Street
2 | Jesse | 456 Broad Ave
3 | Amruta | 9876 Green Parkway
5 | Marie | 333 Ocean Ave
20 | Lola | 333 Schermerhorn
(5 rows)
RENAME SEQUENCE
RENAME TO 语句是ALTER SEQUENCE的一部分,用于更改序列的名称。
注意:
不能重命名表中正在使用的序列。要重命名序列,请删除DEFAULT引用该序列的表达式,重命名该序列,然后再添加这些DEFAULT表达式。
语法格式
重命名序列的语法格式如下:
参数说明
- current_name
要修改的序列的当前名称。
- new_name
序列的新名称,该名称对于其数据库必须是唯一的,并且遵循本数据库标识符规则。
名称更改不会使用该顺序传播到表。
语法示例
示例1:重命名序列。
在此示例中,将序列名称sequence_test更改为sequence_number。
SELECT * FROM information_schema.sequences;
sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
+—————————+————————-+——————————+—————-+—————————-+————————————-+———————-+——————-+———————————+——————————-+—————-+———————+
db4 | public | customer_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 2 | NO
db4 | public | sequence_test | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
db4 | public | desc_customer_list | bigint | 64 | 2 | 0 | -1 | -9223372036854775808 | -1 | -2 | NO
ALTER SEQUENCE sequence_test RENAME TO sequence_number;
RENAME SEQUENCE
SELECT * FROM information_schema.sequences;
sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
+—————————+————————-+——————————+—————-+—————————-+————————————-+———————-+——————-+———————————+——————————-+—————-+———————+
db4 | public | customer_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 2 | NO
db4 | public | sequence_number | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
db4 | public | desc_customer_list | bigint | 64 | 2 | 0 | -1 | -9223372036854775808 | -1 | -2 | NO |
示例2:移动序列。
在此示例中,我们将在第一个示例(sequence_number)中重命名的序列移至其他数据库。
SELECT * FROM information_schema.sequences;
sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
+—————————+————————-+——————————+—————-+—————————-+————————————-+———————-+——————-+———————————+——————————-+—————-+———————+
db4 | public | sequence_number | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO
db4 | public | customer_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 2 | NO
db4 | public | desc_customer_list | bigint | 64 | 2 | 0 | -1 | -9223372036854775808 | -1 | -2 | NO
(3 rows)
ALTER SEQUENCE sequence_number RENAME TO db1.sequence_number;
RENAME SEQUENCE
SELECT * FROM information_schema.sequences;
sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
+—————————+————————-+——————————+—————-+—————————-+————————————-+———————-+——————-+———————————+——————————-+—————-+———————+
db4 | public | desc_customer_list | bigint | 64 | 2 | 0 | -1 | -9223372036854775808 | -1 | -2 | NO
db4 | public | customer_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 2 | NO
DROP SEQUENCE
DROP SEQUENCE语句用于从数据库中删除序列。
当没有对象依赖于目标序列时,任何用户拥有目标序列的DROP权限,即可执行删除目标序列的操作。删除成功后,所有用户针对目标序列的所有权限均被删除。
当有对象依赖于目标序列时,不可执行删除操作。
语法格式
删除序列的语法格式如下:
如果加上IF EXISTS关键字则仅当序列存在时才删除它;如果不存在,则不返回错误。
RESTRICT:(默认)如果有任何对象(例如约束和表)使用序列,则不要删除该序列。
CASCADE:尚未实现。当前,如果没有任何依赖关系,则只能删除序列。
参数说明
要删除的序列的名称。使用SHOW CREATE在表上找到的序列名称。
语法示例
示例1:删除序列(无依赖性)。
在此示例中,没有对象依赖于要删除的序列。