分享到
- [一鍵分享](#)
- [QQ空間](#)
- [新浪微博](#)
- [百度搜藏](#)
- [人人網](#)
- [騰訊微博](#)
- [百度相冊](#)
- [開心網](#)
- [騰訊朋友](#)
- [百度貼吧](#)
- [豆瓣網](#)
- [搜狐微博](#)
- [百度新首頁](#)
- [QQ好友](#)
- [和訊微博](#)
- [更多...](#)
[百度分享](#)
隨筆-102? 文章-0? 評論-83?
# [PostgreSQL 序列(SEQUENCE)](http://www.cnblogs.com/mchina/archive/2013/04/10/3012493.html)
**一、簡介**
序列對象(也叫序列生成器)就是用CREATE SEQUENCE 創建的特殊的單行表。一個序列對象通常用于為行或者表生成唯一的標識符。
**二、創建序列**
**方法一:**直接在表中指定字段類型為serial 類型
[]( "復制代碼")
~~~
david=# create table tbl_xulie (
david(# id serial,
david(# name text);
NOTICE: CREATE TABLE will create implicit sequence "tbl_xulie_id_seq" for serial column "tbl_xulie.id"
CREATE TABLE
david=#
~~~
[]( "復制代碼")
**方法二:**先創建序列名稱,然后在新建的表中列屬性指定序列就可以了,該列需int 類型
創建序列的語法:
~~~
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
[ OWNED BY { table.column | NONE } ]
~~~
實例:
~~~
david=# create sequence tbl_xulie2_id_seq increment by 1 minvalue 1 no maxvalue start with 1;
CREATE SEQUENCE
david=#
~~~
~~~
david=# create table tbl_xulie2 (
david(# id int4 not null default nextval('tbl_xulie2_id_seq'),
david(# name text);
CREATE TABLE
david=#
~~~
**三、查看序列**
[]( "復制代碼")
~~~
david=# \d tbl_xulie
Table "public.tbl_xulie"
Column | Type | Modifiers
--------+---------+--------------------------------------------------------
id | integer | not null default nextval('tbl_xulie_id_seq'::regclass)
name | text |
david=# \d tbl_xulie2
Table "public.tbl_xulie2"
Column | Type | Modifiers
--------+---------+---------------------------------------------------------
id | integer | not null default nextval('tbl_xulie2_id_seq'::regclass)
name | text |
david=#
~~~
[]( "復制代碼")
查看序列屬性
[]( "復制代碼")
~~~
david=# \d tbl_xulie_id_seq
Sequence "public.tbl_xulie_id_seq"
Column | Type | Value
---------------+---------+---------------------
sequence_name | name | tbl_xulie_id_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_xulie.id
david=#
~~~
[]( "復制代碼")
[]( "復制代碼")
~~~
david=# select * from tbl_xulie2_id_seq;
sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called
-------------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
tbl_xulie2_id_seq | 1 | 1 | 1 | 9223372036854775807 | 1 | 1 | 0 | f | f
(1 row)
david=#
~~~
[]( "復制代碼")
**四、序列應用**
4.1 在INSERT 命令中使用序列
[]( "復制代碼")
~~~
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'David');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Sandy');
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----+-------
1 | David
2 | Sandy
(2 rows)
david=#
~~~
[]( "復制代碼")
4.2 數據遷移后更新序列
[]( "復制代碼")
~~~
david=# truncate tbl_xulie;
TRUNCATE TABLE
david=#
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Sandy');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'David');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Eagle');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Miles');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Simon');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Rock');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Peter');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Sally');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Nicole');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Monica');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Renee');
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----+--------
15 | Sandy
16 | David
17 | Eagle
18 | Miles
19 | Simon
20 | Rock
21 | Peter
22 | Sally
23 | Nicole
24 | Monica
25 | Renee
(11 rows)
david=# copy tbl_xulie to '/tmp/tbl_xulie.sql';
COPY 11
david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# alter sequence tbl_xulie_id_seq restart with 100;
ALTER SEQUENCE
david=# select currval('tbl_xulie_id_seq');
currval
---------
25
(1 row)
david=# select nextval('tbl_xulie_id_seq');
nextval
---------
100
(1 row)
david=# select nextval('tbl_xulie_id_seq');
nextval
---------
101
(1 row)
david=# begin;
BEGIN
david=# copy tbl_xulie from '/tmp/tbl_xulie.sql';
COPY 11
david=# select setval('tbl_xulie_id_seq', max(id)) from tbl_xulie;
setval
--------
25
(1 row)
david=# end;
COMMIT
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Flash');
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----+--------
15 | Sandy
16 | David
17 | Eagle
18 | Miles
19 | Simon
20 | Rock
21 | Peter
22 | Sally
23 | Nicole
24 | Monica
25 | Renee
26 | Flash
(12 rows)
david=# select nextval('tbl_xulie_id_seq');
nextval
---------
27
(1 row)
david=#
~~~
[]( "復制代碼")
**五、序列函數**
下面序列函數,為我們從序列對象中獲取最新的序列值提供了簡單和并發讀取安全的方法。
| **函數** | **返回類型** | **描述** |
|-----|-----|-----|
| nextval(regclass) | bigint | 遞增序列對象到它的下一個數值并且返回該值。這個動作是自動完成的。即使多個會話并發運行nextval,每個進程也會安全地收到一個唯一的序列值。 |
| currval(regclass) | bigint | 在當前會話中返回最近一次nextval抓到的該序列的數值。(如果在本會話中從未在該序列上調用過?nextval,那么會報告一個錯誤。)請注意因為此函數返回一個會話范圍的數值,而且也能給出一個可預計的結果,因此可以用于判斷其它會話是否執行過nextval。 |
| lastval() | bigint | 返回當前會話里最近一次nextval返回的數值。這個函數等效于currval,只是它不用序列名為參數,它抓取當前會話里面最近一次nextval使用的序列。如果當前會話還沒有調用過nextval,那么調用lastval將會報錯。 |
| setval(regclass, bigint) | bigint | 重置序列對象的計數器數值。設置序列的last_value字段為指定數值并且將其is_called字段設置為true,表示下一次nextval將在返回數值之前遞增該序列。 |
| setval(regclass, bigint, boolean) | bigint | 重置序列對象的計數器數值。功能等同于上面的setval函數,只是is_called可以設置為true或false。如果將其設置為false,那么下一次nextval將返回該數值,隨后的nextval才開始遞增該序列。 |
?
5.1?查看下一個序列值
[]( "復制代碼")
~~~
david=# select nextval('tbl_xulie_id_seq');
nextval
---------
3
(1 row)
david=# select nextval('tbl_xulie_id_seq');
nextval
---------
4
(1 row)
david=#
~~~
[]( "復制代碼")
5.2 查看序列最近使用值
[]( "復制代碼")
~~~
david=# select nextval('tbl_xulie_id_seq');
nextval
---------
4
(1 row)
david=# select currval('tbl_xulie_id_seq');
currval
---------
4
(1 row)
david=# select currval('tbl_xulie_id_seq');
currval
---------
4
(1 row)
david=#
~~~
[]( "復制代碼")
5.3 重置序列
**方法一:**使用序列函數
a.?setval(regclass, bigint)
[]( "復制代碼")
~~~
david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# select setval('tbl_xulie_id_seq', 1);
setval
--------
1
(1 row)
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Sandy');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'David');
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----+-------
2 | Sandy
3 | David
(2 rows)
david=# select currval('tbl_xulie_id_seq');
currval
---------
3
(1 row)
david=# select nextval('tbl_xulie_id_seq');
nextval
---------
4
(1 row)
david=#
~~~
[]( "復制代碼")
b.?setval(regclass, bigint, boolean)
b.1?setval(regclass, bigint, true)
[]( "復制代碼")
~~~
david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# select setval('tbl_xulie_id_seq', 1, true);
setval
--------
1
(1 row)
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Sandy');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'David');
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----+-------
2 | Sandy
3 | David
(2 rows)
david=#
~~~
[]( "復制代碼")
效果同a.?setval(regclass, bigint)
b.2?setval(regclass, bigint, false)
[]( "復制代碼")
~~~
david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# select setval('tbl_xulie_id_seq', 1, false);
setval
--------
1
(1 row)
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Sandy');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'David');
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----+-------
1 | Sandy
2 | David
(2 rows)
david=#
~~~
[]( "復制代碼")
**方法二:**修改序列
修改序列的語法:
[]( "復制代碼")
~~~
ALTER SEQUENCE 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.column | NONE } ]
ALTER SEQUENCE name OWNER TO new_owner
ALTER SEQUENCE name RENAME TO new_name
ALTER SEQUENCE name SET SCHEMA new_schema
~~~
[]( "復制代碼")
實例:
[]( "復制代碼")
~~~
david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# alter sequence tbl_xulie_id_seq restart with 0;
ERROR: RESTART value (0) cannot be less than MINVALUE (1)
david=# alter sequence tbl_xulie_id_seq restart with 1;
ALTER SEQUENCE
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'David');
INSERT 0 1
david=# insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'Sandy');
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----+-------
1 | David
2 | Sandy
(2 rows)
david=# select nextval('tbl_xulie_id_seq');
nextval
---------
3
(1 row)
david=#
~~~
[]( "復制代碼")
**六、刪除序列**
語法:
~~~
DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
~~~
當有表字段使用到PG序列時,不能直接刪除。
[]( "復制代碼")
~~~
david=# drop sequence tbl_xulie2_id_seq;
ERROR: cannot drop sequence tbl_xulie2_id_seq because other objects depend on it
DETAIL: default for table tbl_xulie2 column id depends on sequence tbl_xulie2_id_seq
HINT: Use DROP ... CASCADE to drop the dependent objects too.
david=# drop table tbl_xulie2;
DROP TABLE
david=# drop sequence tbl_xulie2_id_seq;
DROP SEQUENCE
david=#
~~~
[]( "復制代碼")
**說明:**對于序列是由建表時指定serial 創建的,刪除該表的同時,對應的序列也會被刪除。
**七、參考資料**
- PostgreSQL官方說明:[http://www.postgresql.org/docs/9.2/static/functions-sequence.html](http://www.postgresql.org/docs/9.2/static/functions-sequence.html)
- PostgreSQL: 數據遷移之序列問題:[http://francs3.blog.163.com/blog/static/40576727201281351925766/](http://francs3.blog.163.com/blog/static/40576727201281351925766/)
分類: [Postgresql](http://www.cnblogs.com/mchina/category/381458.html)
標簽: [postgresql](http://www.cnblogs.com/mchina/tag/postgresql/), [序列](http://www.cnblogs.com/mchina/tag/序列/), [SEQUENCE](http://www.cnblogs.com/mchina/tag/SEQUENCE/)
綠色通道: [好文要頂]()[關注我]()[收藏該文]()[與我聯系](http://space.cnblogs.com/msg/send/David_Tang)[]( "分享至新浪微博")
[](http://home.cnblogs.com/u/mchina/)
[David_Tang](http://home.cnblogs.com/u/mchina/)
[關注 - 1](http://home.cnblogs.com/u/mchina/followees)
[粉絲 - 116](http://home.cnblogs.com/u/mchina/followers)
[+加關注]()
0
0
(請您對文章做出評價)
[? ](http://www.cnblogs.com/mchina/archive/2013/04/09/2973427.html) 上一篇:[PostgreSQL分區表(Table Partitioning)應用](http://www.cnblogs.com/mchina/archive/2013/04/09/2973427.html "發布于2013-04-09 11:14")
[? ](http://www.cnblogs.com/mchina/archive/2013/04/15/3010418.html) 下一篇:[PostgreSQL的時間/日期函數使用](http://www.cnblogs.com/mchina/archive/2013/04/15/3010418.html "發布于2013-04-15 11:56")
posted @ 2013-04-10 15:52[David_Tang](http://www.cnblogs.com/mchina/) 閱讀(644) 評論(0) [編輯](http://www.cnblogs.com/mchina/admin/EditPosts.aspx?postid=3012493)[收藏](#)

Copyright ?2013 David_Tang
- 數據表
- 模式Schema
- 表的繼承和分區
- 常用數據類型
- 函數和操作符-一
- 函數和操作符-二
- 函數和操作符-三
- 索引
- 事物隔離
- 性能提升技巧
- 服務器配置
- 角色和權限
- 數據庫管理
- 數據庫維護
- 系統表
- 系統視圖
- SQL語言函數
- PL-pgSQL過程語言
- PostgreSQL 序列(SEQUENCE)
- PostgreSQL的時間-日期函數使用
- PostgreSQL 查看數據庫,索引,表,表空間大小
- 用以查詢某表的詳細 包含表字段的注釋信息
- PostgreSQL 系統表查看系統信息
- postgre存儲過程簡單實用方法
- PostgreSQL實用日常維護SQL
- PostgreSQL的時間函數使用整理
- 命令
- pg_ctl控制服務器
- initdb 初始化數據庫簇
- createdb創建數據庫
- dropdb 刪除數據庫
- createuser創建用戶
- dropuser 刪除用戶
- psql交互式工具
- psql命令手冊
- pg_dump 數據庫轉儲
- pg_restore恢復數據庫
- vacuumdb 清理優化數據庫
- reindexdb 數據庫重創索引
- createlang 安裝過程語言
- droplang 刪除過程語言
- pg_upgrade 升級數據庫簇
- 調試存儲過程
- 客戶端命令-一
- 客戶端命令-二
- 使用技巧
- PostgreSQL刪除重復數據
- postgresql 小技巧
- PostgreSQL的10進制與16進制互轉
- PostgreSQL的漢字轉拼音
- Postgres重復數據的更新一例
- PostgreSQL使用with一例
- PostgreSQL在函數內返回returning
- PostgreSQL中的group_concat使用
- PostgreSQL數據庫切割和組合字段函數
- postgresql重復數據的刪除
- PostgreSQL的遞歸查詢(with recursive)
- PostgreSQL函數如何返回數據集
- PostgreSQL分區表(Table Partitioning)應用 - David_Tang - 博客園
- PostgreSQL: function 返回結果集多列和單列的例子
- 利用pgAgent創建定時任務
- 淺談 PostgreSQL 類型轉換類似Oracle
- postgresql在windows(包括win7)下的安裝配置
- PostgreSQL簡介、安裝、用戶管理、啟動關閉、創建刪除數據庫 (2010-11-08 12-52-51)轉載▼標簽: 雜談分類: PostgreSQL
- PostgreSQL的generate_series函數應用
- PostgreSQL 8.3.1 全文檢索(Full Text Search)
- postgresql record 使用
- 備份恢復
- PostgreSQL基于時間點恢復(PITR)
- Postgresql基于時間點恢復PITR案例(二)
- Postgres邏輯備份腳本
- Postgres invalid command \N數據恢復處理