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