淺析PostgreSQL序列(SEQUENCE)、常用序列操作、數據遷移后更新序列流程


  序列是什么?序列對象(也叫序列生成器)就是用CREATE SEQUENCE 創建的特殊的單行表。一個序列對象通常用於為行或者表生成唯一的標識符。

  在持久層框架如Hibernate(JPA)、Mybatis中經常會用到Sequences(函數)去創建主鍵值,PostgreSQL中,用serial數據類型的主鍵,數據庫會自動創建Sequences,那么我們自己設置的integer主鍵,如何設置添加Sequences呢?

一、常用序列操作:

1、創建序列(從1開始,遞增幅度1,最大值無上限):

create sequence fl_user_seq increment by 1 minvalue 1 no maxvalue start with 1;

2、更改序列值(方法中兩個參數分別是1.序列名字,2.序列修改后值):

select setval('fl_user_seq ', 88);

3、創建序列

CREATE SEQUENCE if not exists test_mergetable_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 999999999 START 1 CACHE 1; -- 或者: 
create sequence if not exists test_mergetable_id_seq increment by 1 minvalue 1 no maxvalue start with 1; 

4、指定序列(給表的主鍵指定創建好的序列)

alter table test_mergetable alter column "i_id" set default nextval('test_mergetable_id_seq');

5、設置序列自增長從當前最大值開始

SELECT setval('test_mergetable_id_seq', (SELECT MAX(i_id) FROM test_mergetable)); alter sequence test_mergetable_id_seq start with 12;

6、刪除序列

drop sequence IF EXISTS test_mergetable_id_seq

7、查看序列

SELECT nextval('test_mergetable_id_seq')

二、創建Sequences

(一)創建序列方法一:直接在表中指定字段類型為serial 類型

create table tbl_xulie (id serial,name text); -- NOTICE: CREATE TABLE will create implicit sequence "tbl_xulie_id_seq" for serial column "tbl_xulie.id" -- CREATE TABLE

(二)方法二:先創建序列名稱,然后在新建的表中列屬性指定序列就可以了,該列需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 } ]

  實例:

create sequence tbl_xulie2_id_seq increment by 1 minvalue 1 no maxvalue start with 1; -- CREATE SEQUENCE
create table tbl_xulie2 (id int4 not null default nextval('tbl_xulie2_id_seq'),name text); -- CREATE TABLE

(三)方法三:圖形pgadmin管理

1、Sequences 名稱: mytable_myid_seq

2、主鍵名 myid

3、模式名 gys

  圖形pgadmin管理:在pgadmin中,我們可以在sequences上右鍵,create -> sequences

 

  OK了,生成的SQL

CREATE SEQUENCE gys.mytable_myid_seq INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 99999999 CACHE 1; ALTER SEQUENCE gys.mytable_myid_seq OWNER TO postgres;

4、為主鍵設置Sequences:

alter table gys.mytable alter column myid set default nextval('gys.mytable_myid_seq');

三、序列應用

1、查看序列

\d tbl_xulie Table "public.tbl_xulie" Column |  Type   | Modifiers --------+---------+--------------------------------------------------------
 id     | integer | not null default nextval('tbl_xulie_id_seq'::regclass) name | text    | 

  查看序列屬性

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)

2、序列應用

(1)在INSERT 命令中使用序列

insert into tbl_xulie values (nextval('tbl_xulie_id_seq'), 'David');

(2)數據遷移后更新序列

  數據遷移后更新序列,一般是需要跨庫的,所以流程是我們先需要到 原來的庫里去拿到序列的下一個值,然后在新庫里去設置為序列的當前值。

  一條一條設置顯然不現實,那就需要依賴去跑腳本啦。

四、序列函數

  下面序列函數,為我們從序列對象中獲取最新的序列值提供了簡單和並發讀取安全的方法。

函數 返回類型 描述
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可以設置為truefalse。如果將其設置為false,那么下一次nextval將返回該數值,隨后的nextval才開始遞增該序列。

 

1、查看下一個序列值

select nextval('tbl_xulie_id_seq');
 nextval --------- 3 (1 row)

2、查看序列最近使用值

select currval('tbl_xulie_id_seq');
 currval --------- 4 (1 row) 

3、重置序列

方法一:使用序列函數:setval(regclass, bigint)

select setval('tbl_xulie_id_seq', 1); setval --------
      1 (1 row)

  使用序列函數:setval(regclass, bigint, boolean)

select setval('tbl_xulie_id_seq', 1, true); setval --------
      1 (1 row)

方法二:修改序列

  修改序列的語法:

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

  修改序列實例

alter sequence tbl_xulie_id_seq restart with 0; -- ERROR: RESTART value (0) cannot be less than MINVALUE (1)

alter sequence tbl_xulie_id_seq restart with 1; -- ALTER SEQUENCE

4、刪除序列

  語法:

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 創建的,刪除該表的同時,對應的序列也會被刪除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM