2010-01-07 14 views
30

Moje pytanie jest proste.PostgreSQL - Używanie podzapytań z wyrażeniami zmieniającymi sekwencje

Czy w PostgreSQL można używać podzapytań w wyrażeniach przerwań?

Chcę zmienić wartość sekwencji na podstawie wartości kolumny klucza podstawowego.

Próbowałem użyć następującego wyrażenia, ale nie zostałoby ono wykonane.

alter sekwencja public.sequenceX restart z (select max (table_id) +1 z tabeli)

z góry dzięki

Odpowiedz

55

nie wierzę można zrobić to tak, ale ci powinien móc używać kierunku funkcji setval, czyli tego, co robi alter.

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

Fałsz spowoduje, że zwróci on następny numer sekwencji, dokładnie tak, jak podano.

+1

Dokładnie to, co Szukałem! Wielkie dzięki! – Danmaxis

+9

'wybierz setval ('sequenceX', (wybierz max (table_id) z tabeli))' zrobi to samo, ponieważ ostatni parametr, "is_called", domyślnie jest ustawiony na true, ale również poprawnie obsługuje przypadek, w którym mógłbyś stworzyć ta sekwencja z INCREMENT BY o wartości innej niż 1. – chbrown

4

Ponadto jeśli mają mieszane nazwy obiektów przypadków i dostajesz błąd takiego:

ERROR: relation "public.mytable_id_seq" does not exist 

... Kolejna wersja użyciu regclass powinny być użyteczne:

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

zajęła mi trochę czasu, aby zauważyć pojedyncze cytaty wokół podwójnych cytatów! –

Powiązane problemy