2010-01-07 52 views
30

我的問題很簡單。Postgresql - 使用具有改變序列表達式的子查詢

是否可以在PostgreSQL的alter表達式中使用子查詢?

我想根據主鍵列值更改序列值。

我試過使用下面的表達式,但它不會執行。

ALTER SEQUENCE public.sequenceX與重新啓動(選擇最多(的table_id)+1從表)

在此先感謝

回答

55

我不相信你可以做到這樣的,但你應該能夠使用setval函數的方向,這是alter的作用。

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

false將使它返回下一個序列號,正如給出的那樣。

+1

究竟是什麼我在尋找! 非常感謝! – Danmaxis 2010-01-07 19:35:12

+9

'select setval('sequenceX',(從表中選擇max(table_id))''將完成同樣的事情,因爲最後一個參數「is_called」,默認爲true,但也正確處理了可能創建的情況該序列的INCREMENT BY值不是1. – chbrown 2014-12-03 20:51:01

4

此外,如果你有大小寫混合的對象名稱和你得到這樣的錯誤:

ERROR: relation "public.mytable_id_seq" does not exist 

...使用regclass的以下版本應該是有用的:

select setval('"public"."MyTable_Id_seq"'::regclass, (select MAX("Id") FROM "public"."MyTable")) 
+0

讓我注意到雙引號內的單引號! – 2018-01-19 20:55:10