postgresql----serial类型和序列

postgresql序列号(SERIAL)类型包括smallserial(smallint,short),serial(int)和bigserial(bigint,long long int),不管是smallserial,serial还是bigserial,其范围都是(1,9223372036854775807),但是序列号类型其实不是真正的类型,当声明一个字段为序列号类型时其实是创建了一个序列,INSERT时如果没有给该字段赋值会默认获取对应序列的下一个值。

测试表1:

test=# create table tbl_serial(a serial,b varchar(2));
CREATE TABLE
test=# \d tbl_serial
                               Table "public.tbl_serial"
 Column |         Type         |                       Modifiers
--------+----------------------+--------------------------------------------------------
 a      | integer              | not null default nextval(‘tbl_serial_a_seq‘::regclass)
 b      | character varying(2) | 

从结果中看,声明字段a为serial类型,会自动创建一个名为tbl_serial_a_seq的序列,INSERT时缺省为该序列的下一个序列值nextval。

自动创建的序列如下定义:

test=# \d tbl_serial_a_seq
      Sequence "public.tbl_serial_a_seq"
    Column     |  Type   |        Value
---------------+---------+---------------------
 sequence_name | name    | tbl_serial_a_seq
 last_value    | bigint  | 1
 start_value   | bigint  | 1
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 0
 is_cycled     | boolean | f
 is_called     | boolean | f
Owned by: public.tbl_serial.a

其实也可以先创建一个序列,然后将表的某字段默认值设为该序列的下一个序列值。

测试表2:

test=# create sequence sql_tbl_serial2_a increment by 1 minvalue 1 no maxvalue start with 1;
CREATE SEQUENCE
test=# create table tbl_serial2(a int not null default nextval(‘sql_tbl_serial2_a‘),b varchar(2));
CREATE TABLE
test=# \d tbl_serial2
                               Table "public.tbl_serial2"
 Column |         Type         |                        Modifiers
--------+----------------------+---------------------------------------------------------
 a      | integer              | not null default nextval(‘sql_tbl_serial2_a‘::regclass)
 b      | character varying(2) | 

test=# \d sql_tbl_serial2_a
      Sequence "public.sql_tbl_serial2_a"
    Column     |  Type   |        Value
---------------+---------+---------------------
 sequence_name | name    | sql_tbl_serial2_a
 last_value    | bigint  | 1
 start_value   | bigint  | 1
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 0
 is_cycled     | boolean | f
 is_called     | boolean | f

此方法和第一种直接使用serial类型效果完全相同,但是这里可以自己定义序列名称。

创建序列的语法如下:

test=# \h create sequence
Command:     CREATE SEQUENCE
Description: define a new sequence generator
Syntax:
CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name [ 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 } ]

其实和上面使用\d一个序列时对应的,

INCREMENT BY : 每次序列增加(或减少)的步长

MINVALUE : 序列最小值,NO MINVALUE表示没有最小值

MAXVALUE : 序列最大值,NO MAXVALUE表示没有最大值

START WITH :以什么序列值开始

CYCLE : 序列是否循环使用

OWNED BY : 可以直接指定一个表的字段,也可以不指定。

序列涉及的函数有:

函 数 返 回 类 型 描 述
currval( regclass ) bigint 获取指定序列最近一次使用netxval后的数值,如果没有使用nextval而直接使用currval会出错。
lastval() bigint 返回最近一次用 nextval 获取的任意序列的数值
nextval( regclass ) bigint 递增序列并返回新值
setval( regclass,bigint ) bigint 设置序列的当前数值
setval( regclass,bigint ,boolean ) bigint 设置序列的当前数值以及 is_called 标志,如果为true则立即生效,如果为false,则调用一次nextval后才会生效。

示例1:获取序列tbl_serial_a_seq当前序列值

test=# select currval(‘tbl_serial_a_seq‘);
ERROR:  currval of sequence "tbl_serial_a_seq" is not yet defined in this session
test=#
test=# select nextval(‘tbl_serial_a_seq‘);
 nextval
---------
       1
(1 row)

test=# select currval(‘tbl_serial_a_seq‘);
 currval
---------
       1
(1 row)

示例2:获取最近一次使用nextval的返回值

test=# select nextval(‘sql_tbl_serial2_a‘);
 nextval
---------
       5
(1 row)

test=# select lastval();
 lastval
---------
       5
(1 row)

test=# select nextval(‘tbl_serial_a_seq‘);
 nextval
---------
       3
(1 row)

test=# select lastval();
 lastval
---------
       3
(1 row)

示例3:将序列tbl_serial_a_seq当前值设为100

test=# select setval(‘tbl_serial_a_seq‘,100);
 setval
--------
    100
(1 row)

test=# select currval(‘tbl_serial_a_seq‘);
 currval
---------
     100
(1 row)

示例4:使用is_called标志设置序列值是马上生效(true)还是下次生效(false)

test=# select setval(‘tbl_serial_a_seq‘,200,true);
 setval
--------
    200
(1 row)

test=# select currval(‘tbl_serial_a_seq‘);
 currval
---------
     200
(1 row)

test=# select setval(‘tbl_serial_a_seq‘,300,false);
 setval
--------
    300
(1 row)

test=# select currval(‘tbl_serial_a_seq‘);
 currval
---------
     200
(1 row)

test=# select nextval(‘tbl_serial_a_seq‘);
 nextval
---------
     300
(1 row)

test=# select currval(‘tbl_serial_a_seq‘);
 currval
---------
     300
(1 row)

修改序列和创建序列的语法基本相同,只是用ALTER替换了CREATE,请参考

test=# \h alter sequence
Command:     ALTER SEQUENCE
Description: change the definition of a sequence generator
Syntax:
ALTER SEQUENCE [ IF EXISTS ] name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ]
    [ RESTART [ [ WITH ] restart ] ]
    [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]

如果一个序列是NO CYCLE,当序列值全部使用完会怎样呢?

test=# create sequence seq_test increment by 2 MINVALUE 1 MAXVALUE 5 START WITH 2 NO CYCLE;
CREATE SEQUENCE
test=# \d seq_test
     Sequence "public.seq_test"
    Column     |  Type   |  Value
---------------+---------+----------
 sequence_name | name    | seq_test
 last_value    | bigint  | 2
 start_value   | bigint  | 2
 increment_by  | bigint  | 2
 max_value     | bigint  | 5
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 0
 is_cycled     | boolean | f
 is_called     | boolean | f

test=# select nextval(‘seq_test‘);
 nextval
---------
       2
(1 row)

test=# select nextval(‘seq_test‘);
 nextval
---------
       4
(1 row)

test=# select nextval(‘seq_test‘);
ERROR:  nextval: reached maximum value of sequence "seq_test" (5)

如果序列值用完了当然是错误了!!!如果是CYCLE则会重新从START处开始再次循环。

时间: 2024-11-17 23:54:29

postgresql----serial类型和序列的相关文章

postgresql数字类型

postgresql的数据类型很多,也可以使用create type命令创建自定义数据类型,但常用的数据类型是以下三种: l  数字数据类型 l  字符串数据类型 l  日期/时间数据类型 数字数据类型 数字数据类型用于指定表中的数字数据,详情如下表所示: 名称 描述 存储大小 范围 smallint 存储整数,小范围 2字节 -32768 至 +32767 integer 存储整数.使用这个类型可存储典型的整数 4字节 -2147483648 至 +2147483647 bigint 存储整数

postgresql 数组类型初步实践

实践环境 数据库:postgresql 9.4:操作系统:windows 创建包含数组类型的数据库 注意在设置default 值时(当然你可以不指定默认值),要声明数组的类型,像这样声明"::bigint[]". create table testarray( id serial primary key, images bigint[] default array[]::bigint[] ); 插入数组值 注意插入数组时,也要声明数组的类型,同上 insert into testarr

6-11 求自定类型元素序列的中位数(25 分)

6-11 6-11 求自定类型元素序列的中位数(25 分) 本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第?N/2+1?大的元素.其中集合元素的类型为自定义的ElementType. 函数接口定义: ElementType Median( ElementType A[], int N ); 其中给定集合元素存放在数组A[]中,正整数N是数组元素个数.该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型. 裁判测试程序样例: #include <stdio.h

4-11 求自定类型元素序列的中位数 (25分)

本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第\lfloor N/2 +1\rfloor?N/2+1?大的元素.其中集合元素的类型为自定义的ElementType. 函数接口定义: ElementType Median( ElementType A[], int N ); 其中给定集合元素存放在数组A[]中,正整数N是数组元素个数.该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型. 裁判测试程序样例: #include <stdio.h> #defin

postgresql ltree类型

最近一个月使用Postgresql的时候,经常遇到ltree的数据,感觉有些别扭,可是有绕不过去.今天决心整理一下,以后使用方便一些. 一.简介 ltree是Postgresql的一个扩展类型,由两位国外PostgreSQL贡献者共同开发.网址如下:http://www.sai.msu.su/~megera/postgres/gist 二.目的 开发这个类型的目的是为了解决复杂的树状模型相关问题,如图: 也是这个网址提到的内容:http://blog.163.com/[email protect

PostgreSQL字段类型说明

BIGSERIALSERIAL8 存储自动递增的惟一整数,最多 8 字节. BIT 固定长度的位串. BIT VARYING(n)VARBIT(n) 可变长度的位串,长度为 n 位. BOOLEAN 存储逻辑布尔值(true/false/unknown),可以是 TRUE.t.true.y.yes 和 1,或者 FALSE.f.false.n.no 和 0. BYTEA 用于存储大型二进制对象(比如图形)的原始二进制数据.使用的存储空间是 4 字节加上二进制串的长度. CHAR(n)CHARAC

Python的数值类型与序列类型

先说一下基本学习要用的一些基本软件: 1.vmware,和virtualbox,:是两款虚拟软件,用于创建虚拟机供使用. 2.ubuntu:一款基于Linux开发的操作系统. 3.Python:Python里面包含的Python解释器. 4.xshell:远程连接控制软件. 5.pycharm:专门为Python开发的一款IDLE. 这个几个软件或者说工具,需要进行配合才能使程序运行起来,配合需要相互配置,相互协调,这个是个难点,需要多加练习. 程序就是需要多加练习,多加学习才能完全去了解他们,

6-11 求自定类型元素序列的中位数 (25分)

本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊大的元素.其中集合元素的类型为自定义的ElementType. 函数接口定义: ElementType Median( ElementType A[], int N ); 其中给定集合元素存放在数组A[]中,正整数N是数组元素个数.该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型. 裁判测试程序样例: #include <stdio.h> #define MAXN 10 typedef float Ele

python数值类型与序列类型

基本运算符 / 浮点除法 //整除 x**y  x的y次方 python中严格区分大小写 type(xx)/内置函数,/查看变量xx的类型 基本数值类型 int float//小数类型(注意:没有double类型) bool //True 相当于1,Flase相当于0 complex //复数类型,例如a=2j,b=1j //--------------------------------------------------------------- import decimal c=decim