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中的序列使用_第1张图片

我们看到自动生成了一个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


你可能感兴趣的:(serial)