Создать последовательность в PostgreSQL

Я пытаюсь создать новую последовательность в PostgreSQL с начальным значением, являющимся максимальным из всех доступных идентификаторов во всех таблицах, используя следующий запрос:

CREATE SEQUENCE idschema.global_id_sequence INCREMENT 1 START (
  SELECT MAX(t.max_id) FROM 
  (
    (SELECT MAX(public.tbl1.id) max_id FROM public.tbl1) UNION
    (SELECT MAX(public.tbl2.id) max_id FROM public.tbl2) UNION
    (SELECT MAX(public.tbl3.id) max_id FROM public.tbl2) UNION
  ) t
);

Это не похоже на работу. Как я могу достичь вышеизложенного в PostgreSQL, используя скаляры или другие средства?

Всего 2 ответа


Вы не можете использовать запрос для предоставления начального значения в CREATE SEQUENCE. Вам нужно использовать setval() после того, как вы создали последовательность:

create sequence idschema.global_id_sequence;
with global_max as (
  select max(max_id) as max_id
  from (
    SELECT MAX(id) max_id FROM public.tbl1 
    UNION ALL
    SELECT MAX(id) max_id FROM public.tbl2
    UNION ALL
    SELECT MAX(id) max_id FROM public.tbl3
  ) t
)
select setval('idschema.global_id_sequence', (select max_id from global_max));

Альтернатива состоит в том, чтобы сделать это в двух частях:

CREATE SEQUENCE seq INCREMENT 1 START WITH 1;
SELECT setval('seq',  
 (SELECT max(val) FROM (
    SELECT max(id) AS val FROM t1 UNION ALL 
    SELECT max(id) AS val FROM t2) j));

Проверьте setval в документации.


Есть идеи?

10000