在PostgreSQL中创建序列

在PostgreSQL中创建序列,sql,postgresql,Sql,Postgresql,我正在尝试使用以下查询在PostgreSQL中创建一个新序列,起始值为所有表中所有可用ID的最大值: 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

我正在尝试使用以下查询在PostgreSQL中创建一个新序列,起始值为所有表中所有可用ID的最大值:

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中实现上述功能?

您不能使用查询在创建序列中提供起始值。创建序列后,需要使用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));

不能使用查询在创建序列中提供起始值。创建序列后,需要使用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));

查看文档。

另一种方法是分两部分进行:

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));
查看文档