數據庫中主鍵的生成一般是通過序列來生成,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重置