You can select last_value from the sequence that is automatically created when using the serial number:
create table test ( id serial primary key, parent integer not null, foreign key (parent) references test(id) ); insert into test values(default, (select last_value from test_id_seq)); insert into test values(default, (select last_value from test_id_seq)); insert into test values(default, (select last_value from test_id_seq)); select * from test; id | parent
And it seems even easier:
insert into test values(default, lastval());
Although I do not know how this will work when using multiple sequences ... I searched for it; lastval () returns the last value returned or set with the last nextval or setval call of any sequence, so the following may cause you problems:
create table test ( id serial primary key, foo serial not null, parent integer not null, foreign key (parent) references test(id) ); select setval('test_foo_seq', 100); insert into test values(default, default, lastval()); ERROR: insert or update on table "test" violates foreign key constraint "test_parent_fkey" DETAIL: Key (parent)=(101) is not present in table "test".
However, it would be nice:
insert into test values(default, default, currval('test_id_seq')); select * from test; id | foo | parent
source share