postgresql 序列Sequence

本文介绍了如何在PostgreSQL中创建序列,包括示例和语法解析。同时,针对自增ID重复问题,提出了通过更新序列值至表中最大键值的解决方案。

一、创建序列

示例

-- SEQUENCE: test_id_seq

-- DROP SEQUENCE test_id_seq;

CREATE SEQUENCE test_id_seq
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 9223372036854775807
    CACHE 1;

语法

CREATE SEQUENCE [ IF NOT EXISTS ] sequence_name  
    [ AS { SMALLINT | INT | BIGINT } ]  
    [ INCREMENT [ BY ] increment ]  
    [ MINVALUE minvalue | NO MINVALUE ]   
    [ MAXVALUE maxvalue | NO MAXVALUE ]  
    [ START [ WITH ] start ]   
    [ CACHE cache ]   
    [ [ NO ] CYCLE ]  
    [ OWNED BY { table_name.column_name | NONE } ]

说明

在上面的语法中,我们使用了以下参数:

范围描述
sequence_namesequence_name 不同于类似模式中的任何其他序列、索引、表、视图或外部表。我们可以在CREATE SEQUENCE之后定义序列名称并且IF NOT EXISTS 条件仅在它不存在时才临时生成一个新序列。
[ AS { SMALLINT \INT \BIGINT } ]调节序列的最大值和最小值的序列的数据类型。我们可以定义序列的数据类型,其中支持的数据类型为INT、BIGINT和SMALLINT。如果我们忘记提及数据类型,则将其视为 BIGINT,因为它是 Sequence 的默认数据类型。
[ INCREMENT [ BY ] increment ]增量描述了值,必须将其添加到现有序列值以生成新值,默认值为 1。此处,正 (+) 数将产生升序,负 (-) 数将产生降序
[ MINVALUE minvalue \NO MINVALUE ]如果我们使用NO MINVALUE 和 NO MAXVALUE,则序列将采用默认值。对于升序,最大默认值为Sequence 数据类型最大值默认最小值1。而对于降序序列,最大默认值为-1默认最小值为Sequence 数据类型的最小值
[ MAXVALUE maxvalue \NO MAXVALUE ][ START [ WITH ] start ]START子句用于定义序列的起始值。并且默认初始值是降序的最大值和升序的最小值
cache一次可以创建一个值,默认情况下,该序列一次创建一个值,没有缓存。该CACHE参数用于指定的序列号预先分配并存储在存储器中用于较早获得。
CYCLE \NO CYCLECYCLE参数允许我们如果达到限制恢复值。在下面的数将是最大值递减序列最小值升序序列。如果我们使用 NO CYCLE,当达到限制时,或者我们正在尝试获取下一个值时,它会在输出中引发错误。该NO CYCLE是默认的,如果我们不定义CYCLE或NO CYCLE
OWNED BY table_name.column_name最后,使用OWNED BY 参数将表列与序列链接起来。因此,PostgreSQL 会自动丢弃相关序列;如果我们删除表或列。

注意:当我们对表的某列使用SERIAL伪类型时,在后台,PostgreSQL会自动生成一个与该列相关的序列。

更新序列的值

 场景:自增id作为key重复的问题

解决方案:

SELECT setval(‘test_id_seq', (SELECT MAX(id) FROM test_table));

即:将序列当前值,更新为表的最大key值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值