Возможно использование отдельного объекта sequence
, например:
create or replace table tab(i int) as select * from values('100'),('200'),('300');
create sequence seq;
create or replace view v as select i, seq.nextval as autoinc from tab;
Однако, поскольку содержимое представления не материализовано .Таким образом, если вы выберете из этого представления, столбец autoinc
будет каждый раз иметь новое значение , например,
select * from v;
-----+---------+
I | NEXTVAL |
-----+---------+
100 | 1 |
200 | 2 |
300 | 3 |
-----+---------+
select * from v;
-----+---------+
I | NEXTVAL |
-----+---------+
100 | 4 |
200 | 5 |
300 | 6 |
-----+---------+
Если это работает для вас, это нормально.Вы также можете воссоздать последовательность перед каждым выбором из вида:
select * from v;
-----+---------+
I | NEXTVAL |
-----+---------+
100 | 1 |
200 | 2 |
300 | 3 |
-----+---------+
create or replace sequence seq;
------------------------------------+
status |
------------------------------------+
Sequence SEQ successfully created. |
------------------------------------+
select * from v;
-----+---------+
I | NEXTVAL |
-----+---------+
100 | 1 |
200 | 2 |
300 | 3 |
-----+---------+
Однако, нет гарантии , что одна и та же запись получит одно и то же значение при каждой оценке представления.Также обратите внимание, что последовательности не гарантируют получение плотного списка чисел (могут быть дыры).
Нижняя строка - лучше всего иметь таблицу со столбцом autoincrement
.