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

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

    语法格式

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

    如果加上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表达式。

    语法格式

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

    SEQUENCE - 图4

    参数说明

    • 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:删除序列(无依赖性)。

    在此示例中,没有对象依赖于要删除的序列。