天天看點

postgreSQL中的序列使用

serial簡單使用如下:

create table stest (id serial,name varchar(10));

insert into stest values(nextval('stest_id_seq'),'bai');

insert into stest values(nextval('stest_id_seq'),'xiao');

insert into stest values(nextval('stest_id_seq'),'yu');

select * from stest;

1;"bai"

2;"xiao"

3;"yu"

insert into stest values(null,'test');

錯誤:  在字段 "id" 中空值違反了非空限制

DETAIL:  失敗, 行包含(null, test).

********** 錯誤 **********

錯誤: 在字段 "id" 中空值違反了非空限制

SQL 狀态: 23502

詳細:失敗, 行包含(null, test).

可以再插入的時候預設這個serial字段,這樣就自動的生成下一個值

insert into stest(name) values('test');

select * from stest;

1;"bai"

2;"xiao"

3;"yu"

4;"test"

select * from pg_class where relname like 'stest%';

postgreSQL中的序列使用

我們看到自動生成了一個stest_id_seq的對象

文檔上面的描述

CREATE TABLE tablename (
    colname SERIAL
);      

等價于聲明下面幾個語句:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;      

删除該表,則與這個表相關聯的sequence自動删除

drop table stest;

select * from pg_class where relname like 'stest%';

傳回空。

如果手工建立序列,文法如下

CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]      

如果添加了temp,那麼這個序列隻會存在于這個會話中,會話結束時這個序列會自動删除。别的選項都跟oracle一樣了

CREATE SEQUENCE serial START 101;

select currval('serial');

select nextval('serial');

要先使用nextval,在使用currval擷取目前的值,currval傳回的是最近一次使用nextval獲得的值。否則直接使用currval會報錯。

select lastval();傳回任何序列的最近的nextval的值。

select setval('serial',300);設定序列的值

300

select nextval('serial'); 是設定的值+1

301

繼續閱讀