• 【PostgreSQL】PostgreSQL中的序列


    PostgreSQL中的序列可以当作MySQL中的auto_increment来使用,但是序列并不是仅仅用于自增列。也就是说:

    PostgreSQL SERIAL != MySQL SERIAL
    

      

    第一,PostgreSQL提供了一个serial数据类型。有smallserial、serial、bigserial,分别占用了2、4、8个字节的内存。相应的最大值为32767、2147483674、9223372036854775807。

    MySQL中有个关键字 serial,是bigint not null auto_increment unique。

    自增示例

    作为示例,来创建个表:

    b=# create table abce(x serial,y char(20), z char(20));
    CREATE TABLE
    b=# \d abce
                                   Table "public.abce"
     Column |     Type      | Collation | Nullable |             Default             
    --------+---------------+-----------+----------+---------------------------------
     x      | integer       |           | not null | nextval('abce_x_seq'::regclass)
     y      | character(20) |           |          | 
     z      | character(20) |           |          | 
    
    b=# 
     

    列x从序列abce_x_seq通过使用nextval()自动获取默认值。

    继续插入一些数据:

    b=# insert into abce(y,z) values(100,200),(300,450);
    INSERT 0 2
    b=# select * from abce;
     x |          y           |          z           
    ---+----------------------+----------------------
     1 | 100                  | 200                 
     2 | 300                  | 450                 
    (2 rows)
    
    b=# 

    我们并没有显式插入x的值。

    使用\d看看表和序列:

    b=# \d
                 List of relations
     Schema |    Name    |   Type   |  Owner   
    --------+------------+----------+----------
     public | abce       | table    | postgres
     public | abce_x_seq | sequence | postgres
    (2 rows)
    
    b=# 
    

      


    序列本身

    序列本身并不需要依赖表的声明定义。在下面的例子中,会创建一个从1001开始的序列。使用函数nextval()获取序列的下一个值:

    b=# create sequence order_id start 1001;
    CREATE SEQUENCE
    b=# select nextval('order_id');
     nextval 
    ---------
        1001
    (1 row)
    
    b=# select nextval('order_id');
     nextval 
    ---------
        1002
    (1 row)
    
    b=# 
    

      

     

    有两种方式来检查当前的值,第一种是直接查询序列:

    b=# select * from order_id;
     last_value | log_cnt | is_called 
    ------------+---------+-----------
           1002 |      31 | t
    (1 row)
    
    b=# 
    

      

     

    第二种,使用函数currval()

    b=# select currval('order_id');
     currval 
    ---------
        1002
    (1 row)
    
    b=# 
    

      

     

    序列不是series

    一个series,顾名思义是一系列数字。但是它们不能像序列一样被引用到列的自动评估中。但是它们对于生成数据非常方便。

    b=# create table test1 as (select generate_series(1,100) as id);
    SELECT 100
    b=# \d test1
                   Table "public.test1"
     Column |  Type   | Collation | Nullable | Default 
    --------+---------+-----------+----------+---------
     id     | integer |           |          | 
    
    b=# select * from test1 limit 5;
     id 
    ----
      1
      2
      3
      4
      5
    (5 rows)
    
    b=# 
    

      


    序列的wraparoud

    序列可以在你想要的数字开始或结束,如果使用CYCLE限定符,也可以环绕以重新开始。在这里,我们创建了一个或两个环绕的重复序列。

    b=# create sequence wrap_seq as int minvalue 1 maxvalue 2 CYCLE;
    CREATE SEQUENCE
    b=# select NEXTVAL('wrap_seq');
     nextval 
    ---------
           1
    (1 row)
    
    b=# select NEXTVAL('wrap_seq');
     nextval 
    ---------
           2
    (1 row)
    
    b=# select NEXTVAL('wrap_seq');
     nextval 
    ---------
           1
    (1 row)
    
    b=# select NEXTVAL('wrap_seq');
     nextval 
    ---------
           2
    (1 row)
    
    b=# select NEXTVAL('wrap_seq');
     nextval 
    ---------
           1
    (1 row)
    
    b=# 
    

      


    其它细节

    可以通过\d查看序列的状态:

    b=# \d order_id;
                              Sequence "public.order_id"
      Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache 
    --------+-------+---------+---------------------+-----------+---------+-------
     bigint |  1001 |       1 | 9223372036854775807 |         1 | no      |     1
    
    b=# \d wrap_seq;
                        Sequence "public.wrap_seq"
      Type   | Start | Minimum | Maximum | Increment | Cycles? | Cache 
    ---------+-------+---------+---------+-----------+---------+-------
     integer |     1 |       1 |       2 |         1 | yes     |     1
    
    b=# 
    

      


  • 相关阅读:
    Mongodb---记一次事故故障
    扎克伯格的中文夜:想要成功就不能放弃
    TTS-零基础入门之停止列表中单条语音播报
    卡尔曼滤波(Kalman Filter) 的进一步讨论
    2014.8.12-AKKA和Actor model 分布式开发环境学习小结
    c# 删除程序占用的文件,强力删除文件,彻底删除文件,解除文件占用
    Spring源代码解析和配置文件载入
    java调用c++ dll出现中文乱码
    Android任务栈TaskStack
    应用中清理缓存应用实现
  • 原文地址:https://www.cnblogs.com/abclife/p/16437453.html
Copyright © 2020-2023  润新知