SEQUENCE

SEQUENCE概述

​ Sequence是数据中一个特殊存放等差数列的表,该表受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下一条记录应该是多少,这个表没有实际意义,常常用来做主键用。

CREATE SEQUENCE

​ CREATE SEQUENCE语句用于在数据库中创建一个新序列。使用序列自动增加表中的整数。

​ 任何用户拥有新建序列所属模式的CREATE权限,即可执行创建新序列的操作。创建成功后,root用户拥有该序列的全部权限:DROP,SELECT,USAGE,UPDATE权限。当创建用户不是root用户时,则除root角色外,用户也同样拥有新建序列的全部权限。

注意:

  • 使用序列比使用UUID,BYTES或SERIAL数据类型自动生成唯一ID要慢。 增加序列需要写入持久存储,而自动生成唯一ID则不需要。 因此,若非必须,否则请使用自动生成的唯一ID。
  • 如果事务使序列递增后回滚,则使用序列的列可能在序列值中出现缺口。 序列更新会立即提交,并且不会与其包含的事务一起回滚。 这样做是为了避免阻塞使用相同序列的并发事务。
  • 用户必须具有父数据库的CREATE特权。
  • 任何依赖于序列的对象在使用序列的当前值(currval)时,用户需要拥有目标序列的USAGE权限;任何依赖于序列的对象在使用序列的下一个值(nextval)时,用户拥有目标序列的USAGE权限。

语法格式

CREATE SEQUENCE的语法格式如下:

SEQUENCE - 图1

  • INCREMENT

序列递增的值。负数会创建一个降序。正数会创建一个升序。

默认: 1

  • 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:使用序列创建表。

CREATE SEQUENCE customer_seq;

CREATE TABLE customer_list ( ID INT PRIMARY KEY DEFAULT nextval( ‘customer_seq’ ), customer string, address string );

CREATE TABLE

INSERT INTO customer_list (customer, address) -> VALUES -> (‘Lauren’, ‘123 Main Street’), -> (‘Jesse’, ‘456 Broad Ave’), -> (‘Amruta’, ‘9876 Green Parkway’);

INSERT 3

SELECT * FROM customer_list;

id | customer | address

+——+—————+——————————+

1 |Lauren | 123 Main Street

2 | Jesse | 456 Broad Ave

3 | Amruta | 9876 Green Parkway |

示例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的语法格式如下:

SEQUENCE - 图2

参数说明

  • 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)。修改成功后,所有用户保留对该序列的原有权限。

语法格式

修改序列的语法格式如下:

SEQUENCE - 图3

如果加上IF EXISTS关键字则仅当序列存在时才对其进行修改;如果不存在,则不返回错误。

  • INCREMENT

序列递增的新值。负数会创建一个降序。正数会创建一个升序。

  • 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表达式。

语法格式

重命名序列的语法格式如下:

SEQUENCE - 图4

如果加上IF EXISTS仅当序列存在时才重命名。如果不存在,则不返回错误。

参数说明

  • 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权限,即可执行删除目标序列的操作。删除成功后,所有用户针对目标序列的所有权限均被删除。

​ 当有对象依赖于目标序列时,不可执行删除操作。

语法格式

删除序列的语法格式如下:

SEQUENCE - 图5

如果加上IF EXISTS关键字则仅当序列存在时才删除它;如果不存在,则不返回错误。

RESTRICT:(默认)如果有任何对象(例如约束和表)使用序列,则不要删除该序列。

CASCADE:尚未实现。当前,如果没有任何依赖关系,则只能删除序列。

参数说明

  • table_name

要删除的序列的名称。使用SHOW CREATE在表上找到的序列名称。

语法示例

示例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

+—————————+————————-+——————————+—————-+—————————-+————————————-+———————-+——————-+———————————+——————————-+—————-+———————+

db4 | public | sequence_seq | bigint | 64 | 2 | 0 | 1 | 1 | 9223372036854775807 | 1 | NO

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

(3 rows)

DROP SEQUENCE sequence_seq;

DROP 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 | desc_customer_list | bigint | 64 | 2 | 0 | -1 | -9223372036854775808 | -1 | -2 | NO

(2 rows) |