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%';

我們看到自動生成了一個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