<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                分享到 - [一鍵分享](#) - [QQ空間](#) - [新浪微博](#) - [百度搜藏](#) - [人人網](#) - [騰訊微博](#) - [百度相冊](#) - [開心網](#) - [騰訊朋友](#) - [百度貼吧](#) - [豆瓣網](#) - [搜狐微博](#) - [百度新首頁](#) - [QQ好友](#) - [和訊微博](#) - [更多...](#) [百度分享](#) 隨筆-102? 文章-0? 評論-83? # [PostgreSQL 序列(SEQUENCE)](http://www.cnblogs.com/mchina/archive/2013/04/10/3012493.html) **一、簡介** 序列對象(也叫序列生成器)就是用CREATE SEQUENCE 創建的特殊的單行表。一個序列對象通常用于為行或者表生成唯一的標識符。 **二、創建序列** **方法一:**直接在表中指定字段類型為serial 類型 [![](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1b8e0e27.gif)]( "復制代碼") **方法二:**先創建序列名稱,然后在新建的表中列屬性指定序列就可以了,該列需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=# ~~~ **三、查看序列** [![](https://box.kancloud.cn/2015-10-30_5632e1b8f0efb.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1b90abd2.gif)]( "復制代碼") 查看序列屬性 [![](https://box.kancloud.cn/2015-10-30_5632e1b917f99.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1b923ded.gif)]( "復制代碼") [![](https://box.kancloud.cn/2015-10-30_5632e1b931445.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1b93e453.gif)]( "復制代碼") **四、序列應用** 4.1 在INSERT 命令中使用序列 [![](https://box.kancloud.cn/2015-10-30_5632e1bbecfe4.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bc0429e.gif)]( "復制代碼") 4.2 數據遷移后更新序列 [![](https://box.kancloud.cn/2015-10-30_5632e1bc1307c.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bd20a15.gif)]( "復制代碼") **五、序列函數** 下面序列函數,為我們從序列對象中獲取最新的序列值提供了簡單和并發讀取安全的方法。 | **函數** | **返回類型** | **描述** | |-----|-----|-----| | 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?查看下一個序列值 [![](https://box.kancloud.cn/2015-10-30_5632e1bd2c4e5.gif)]( "復制代碼") ~~~ david=# select nextval('tbl_xulie_id_seq'); nextval --------- 3 (1 row) david=# select nextval('tbl_xulie_id_seq'); nextval --------- 4 (1 row) david=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bd398de.gif)]( "復制代碼") 5.2 查看序列最近使用值 [![](https://box.kancloud.cn/2015-10-30_5632e1bd46617.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bd53966.gif)]( "復制代碼") 5.3 重置序列 **方法一:**使用序列函數 a.?setval(regclass, bigint) [![](https://box.kancloud.cn/2015-10-30_5632e1bd6391d.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bd72568.gif)]( "復制代碼") b.?setval(regclass, bigint, boolean) b.1?setval(regclass, bigint, true) [![](https://box.kancloud.cn/2015-10-30_5632e1bd7f621.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bd8c1e7.gif)]( "復制代碼") 效果同a.?setval(regclass, bigint) b.2?setval(regclass, bigint, false) [![](https://box.kancloud.cn/2015-10-30_5632e1bda292b.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bdb260d.gif)]( "復制代碼") **方法二:**修改序列 修改序列的語法: [![](https://box.kancloud.cn/2015-10-30_5632e1bdbed65.gif)]( "復制代碼") ~~~ 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 ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bdd0142.gif)]( "復制代碼") 實例: [![](https://box.kancloud.cn/2015-10-30_5632e1bddf170.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1bdea8f2.gif)]( "復制代碼") **六、刪除序列** 語法: ~~~ DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ] ~~~ 當有表字段使用到PG序列時,不能直接刪除。 [![](https://box.kancloud.cn/2015-10-30_5632e1be02c47.gif)]( "復制代碼") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1be100cc.gif)]( "復制代碼") **說明:**對于序列是由建表時指定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)[![](https://box.kancloud.cn/2015-10-30_5632e1be1bfdf.png)]( "分享至新浪微博") [![](https://box.kancloud.cn/2015-10-30_5632e1be29212.jpg)](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)[收藏](#) ![](https://box.kancloud.cn/2015-10-30_5632e1be38046.jpg) Copyright ?2013 David_Tang
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看