Próbuję ustawić sekwencję na określoną wartość.
SELECT setval('payments_id_seq'), 21, true
Daje to błąd:
ERROR: function setval(unknown) does not exist
Używanie ALTER SEQUENCE
też nie działa?
ALTER SEQUENCE payments_id_seq LASTVALUE 22
Jak można to zrobić?
Ref: https://www.postgresql.org/docs/current/static/functions-sequence.html
setval()
ma co najmniej dwa argumenty.Odpowiedzi:
Nawiasy są źle umieszczone:
W przeciwnym razie sprawdzasz
setval
z jednym argumentem, podczas gdy wymaga on dwóch lub trzech.źródło
true
oznacza, że następną wartością będzie podana liczba + 1, w tym przypadku 22.false
oznacza, że następną wartością będzie podana liczba, lub 21. Domyślnie setval będzie zachowywał się tak, jakbytrue
został wybrany. Więcej informacji: postgresql.org/docs/9.6/static/functions-sequence.htmlselect setval
składnialter sequence
jest to, że można w niej używać zagnieżdżonych zapytań, na przykład doselect max(id) from payments
.Ta składnia nie jest poprawna w żadnej wersji PostgreSQL:
To by działało:
i jest równoważny:
Więcej w aktualnym podręczniku funkcji
ALTER SEQUENCE
i sekwencji .Należy pamiętać, że
setval()
spodziewa się, albo(regclass, bigint)
czy(regclass, bigint, boolean)
. W powyższym przykładzie dostarczam literały bez typów . To też działa. Ale jeśli podajesz zmienne typowane do funkcji, możesz potrzebować rzutowania typu jawnego, aby spełnić rozdzielczość typu funkcji. Lubić:W przypadku powtarzających się operacji możesz być zainteresowany:
START [WITH]
przechowuje domyślnyRESTART
numer, który służy do kolejnychRESTART
połączeń bez wartości. Do ostatniej części potrzebujesz Postgres 8.4 lub nowszy.źródło
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);
nie działa, aSELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);
działa. Otrzymuję błąd składniowy. (Postgres 9.4)SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);
że inaczej twoje pareny się nie ustawią .SELECT setval('seq', max(col)) FROM tbl;
Patrz: stackoverflow.com/a/23390399/939860Posługiwać się
select setval('payments_id_seq', 21, true);
setval
zawiera 3 parametry:sequence_name
nextval
Użycie true lub false w 3. parametrze setval jest następujące:
Aby lepiej zakodować na stałe nazwę sekwencji, kolejną wartość sekwencji i poprawnie obsługiwać pustą tabelę kolumn, możesz użyć następującego sposobu:
gdzie
table_name
jest nazwa tabeli,id
to nazwaprimary key
tabeliźródło
źródło
Nie próbuję zmienić sekwencji za pomocą
setval
. Ale za pomocąALTER
I wydano, jak poprawnie napisać nazwę sekwencji. I to działa tylko dla mnie:Sprawdź wymaganą nazwę sekwencji za pomocą
SELECT * FROM information_schema.sequences;
ALTER SEQUENCE public."table_name_Id_seq" restart {number};
W moim przypadku tak było
ALTER SEQUENCE public."Services_Id_seq" restart 8;
źródło