標籤:全域 new bsp rda last 指定欄位 主鍵 height san
資料庫中主鍵的產生一般是通過序列來產生,PG的序列知識主要羅列如下:
如何找到序列的名稱:用pgadmin開啟當前所用資料庫,在schemas->sequences下找到相關的序列,然後SELECTnextval(‘im_indicator_results_seq‘);查看當前的序號,在去相關的表中查看已有的最大序號,如:selectmax(result_id) from im_indicator_results;,最後設定當前序號為最大序號SELECTsetval(‘im_indicator_results_seq‘, 5288);
方法a:直接在表中指定欄位類型是 SERIAL 類型就一了
CREATE TABLE person ( id SERIAL, name TEXT );
CREATE SEQUENCE person_id_seq; CREATE TABLE person ( id INT4 NOT NULL DEFAULT nextval(‘person_id_seq‘), name TEXT ); SELECT currval(‘person_id_seq‘) ; SELECT nextval(‘person_id_seq‘) ; select last_value from person_id_seq; select setval(seq_name,new_seq_value);
SELECT setval(‘foo‘, 42); --下次nextval將返回43 SELECT setval(‘foo‘, 42, false); --下次nextval將返回42
drop table table_name;
drop sequence seq_name;
a.currval取得的是當前會話的序列值,在當前會話中該值不會因為其他會話取了nextval而變化。會變化的是全域的last_value值,並且當前會話中如果沒有讀過nextval值時直接讀currval是會報錯的。
b.對於序列是由建表時指定serial時建立時,刪除該表的同時,對應的序列也會被刪除。
c.表主鍵資料可以用跟表相關的序列,也可以用其他序列,但不推薦,只是PG預設它沒錯。
d.為使多使用者並發下同一個序列取值不會重複,nextval是不會rollback的,不過可以使用setval重設
PostgreSQL 序列使用