53

Is it possible to use subqueries within alter expressions in PostgreSQL?

I want to alter a sequence value based on a primary key column value.

I tried using the following expression, but it wouldn't execute.

alter sequence public.sequenceX restart with (select max(table_id)+1 from table)
janniks
  • 2,942
  • 4
  • 23
  • 36
Danmaxis
  • 1,710
  • 4
  • 17
  • 27

2 Answers2

96

I don't believe you can do it like that but you should be able to use the setval function direction which is what the alter does.

select setval('sequenceX', (select max(table_id)+1 from table), false)

The false will make it return the next sequence number as exactly what is given.

Arthur Thomas
  • 5,088
  • 1
  • 25
  • 31
  • 17
    `select setval('sequenceX', (select max(table_id) from table))` will accomplish the same thing, since the last parameter, "is_called", defaults to true, but also correctly handles the case where you might have created that sequence with an INCREMENT BY value other than 1. – chbrown Dec 03 '14 at 20:51
  • do i need a from table at the end of the whole statement? "missing from clause" – FlavorScape Mar 21 '18 at 19:10
8

In addition if you have mixed case object names and you're getting an error like this:

ERROR: relation "public.mytable_id_seq" does not exist

... the following version using regclass should be useful:

select setval('"public"."MyTable_Id_seq"'::regclass, (select MAX("Id") FROM "public"."MyTable"))
Duncan Smart
  • 31,172
  • 10
  • 68
  • 70