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处开始再次循环。
postgresql----serial类型和序列的更多相关文章
- PostgreSQL SERIAL创建自增列
PostgreSQL SERIAL创建自增列 本文我们介绍PostgreSQL SERIAL,并展示如何使用serial类型创建表自增列. PostgreSQL SERIAL伪类型 PostgreSQ ...
- postgresql数字类型
postgresql的数据类型很多,也可以使用create type命令创建自定义数据类型,但常用的数据类型是以下三种: l 数字数据类型 l 字符串数据类型 l 日期/时间数据类型 数字数据类 ...
- PAT 基础编程题 4-11 求自定类型元素序列的中位数(希尔排序)
4-11 求自定类型元素序列的中位数 (25分) 本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第\lfloor N/2 +1\rfloor⌊N/2+1⌋大的元素.其中集合元素的类型 ...
- 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏
一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...
- python基础之数值类型与序列类型
Hello大家好,我是python学习者小杨同学,已经学习python有一段时间,今天将之前学习过的内容整理一番,在这与大家分享与交流,现在开始我们的python基础知识之旅吧. 数值类型与序列类型 ...
- postgresql ltree类型
最近一个月使用Postgresql的时候,经常遇到ltree的数据,感觉有些别扭,可是有绕不过去.今天决心整理一下,以后使用方便一些. 一.简介 ltree是Postgresql的一个扩展类型,由两位 ...
- PostgreSQL字段类型说明
BIGSERIALSERIAL8 存储自动递增的惟一整数,最多 8 字节. BIT 固定长度的位串. BIT VARYING(n)VARBIT(n) 可变长度的位串,长度为 n 位. BOOLEAN ...
- PostgreSQL 数组类型
PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型.用户自定义的类型.枚举类型, 以及组合类型.但目前还不支持 domain 类型. 数组类型的 ...
- python数值类型与序列类型
基本运算符 / 浮点除法 //整除 x**y x的y次方 python中严格区分大小写 type(xx)/内置函数,查看变量xx的类型 id(xx)/内置函数,查看变量xx的内存地址 //----- ...
随机推荐
- Orchard Module,Theme,Core扩展加载概述
Orchard 源码探索(Module,Theme,Core扩展加载概述) 参考: http://www.orchardch.com/Blog/20120830071458 1. host.Initi ...
- Toad for Oracle的安装
分享一下Oracle 10gToad for Oracle的安装步骤 三年前用过Oracle,单纯的“用过”,主要就是说对数据库的一些操作,还不包含创建一些存储过程之类的,所以对Oracle仅仅只 ...
- nant build
http://stackoverflow.com/questions/700871/publish-webapplication-using-nant <target name="co ...
- c# in deep 之使用匿名方法的内联委托操作
匿名方法允许我们指定一个内联委托的操作,为创建委托实例表达式的一部分.其可以对代码进行极度精简,当然可读性变得很差.下面看一个求平方根的例子. List<int> list = new L ...
- CLR基础之一---认识CLR [《CLR via C#》读书笔记]
<CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称.这 ...
- 《12个有趣的C语言问答》(4)
C语言面试问答——<12个有趣的C语言问答>评析(4) 前文链接:http://www.cnblogs.com/pmer/p/3324063.html 8,Making changes i ...
- IOS7学习之路三(UISpriteKit游戏开发SKNode)
ios7新添加了自己的游戏开发框架UISpriteKit ,可以用此做一些2D的小游戏, 今天学习了一下SKNode的知识做一下笔记,以便以后查阅. 1.SKNode继承自UIResponder. 2 ...
- C#线程同步(转)
线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多线程处理提供了用不 ...
- RTB撕开黑盒子 Part 0:Pacing: is everyone doing it wrong?
曾尝试为我们的RTB客户解决过Pacing问题,Pacing问题要解决的问题是:如果一个客户给你一笔预算,让你去运营一个广告推广计划,在一定的时间内投放广告,将这笔预算在指内的时间内,比较均匀地将预算 ...
- 项目做成jar包
项目做成jar包 方法一.在eclipse3.1中把项目做成jar包步骤. 打包前的工作. 在项目下创建一个文件夹,名为META-INF,再在其下创建文件MANIFEST.MF 编辑的内容如下: Ma ...