Bạn có thể chọn last_value từ chuỗi, được tạo tự động khi bạn sử dụng loại serial:
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
----+--------
1 | 1
2 | 2
3 | 3
(3 rows)
Và điều đơn giản hơn sau đây dường như cũng hoạt động:
insert into test values(default, lastval());
Mặc dù tôi không biết điều này sẽ hoạt động như thế nào khi sử dụng nhiều chuỗi ... tôi đã tìm kiếm nó; lastval () trả về giá trị cuối cùng được trả về hoặc được đặt với lệnh gọi nextval hoặc setval cuối cùng cho bất kỳ chuỗi nào, vì vậy, những điều sau sẽ khiến bạn gặp rắc rối:
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".
Tuy nhiên, những điều sau sẽ ổn:
insert into test values(default, default, currval('test_id_seq'));
select * from test;
id | foo | parent
----+-----+--------
2 | 102 | 2
(1 row)