问题
I\'m trying to set a sequence to a specific value.
SELECT setval(\'payments_id_seq\'), 21, true
This gives an error:
ERROR: function setval(unknown) does not exist
Using ALTER SEQUENCE
doesn\'t seem to work either?
ALTER SEQUENCE payments_id_seq LASTVALUE 22
How can this be done?
Ref: https://www.postgresql.org/docs/current/static/functions-sequence.html
回答1:
The parentheses are misplaced:
SELECT setval('payments_id_seq', 21, true); # next value will be 22
Otherwise you're calling setval
with a single argument, while it requires two or three.
回答2:
This syntax isn't valid in any version of PostgreSQL:
ALTER SEQUENCE payments_id_seq LASTVALUE 22
This would work:
ALTER SEQUENCE payments_id_seq RESTART WITH 22;
and is equivalent to:
SELECT setval('payments_id_seq', 22, FALSE);
More in the current manual for ALTER SEQUENCE and sequence functions.
Note that setval()
expects either (regclass, bigint)
or (regclass, bigint, boolean)
. In the above example I am providing untyped literals. That works too. But if you feed typed variables to the function you may need explicit type casts to satisfy function type resolution. Like:
SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);
For repeated operations you might be interested in:
ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART; -- without value
START [WITH]
stores a default RESTART
number, which is used for subsequent RESTART
calls without value. You need Postgres 8.4 or later for the last part.
回答3:
Use select setval('payments_id_seq', 21, true);
setval
contains 3 parameters:
- 1st parameter is
sequence_name
- 2nd parameter is Next
nextval
- 3rd parameter is optional.
The use of true or false in 3rd parameter of setval is as follows:
SELECT setval('payments_id_seq', 21); // Next nextval will return 22
SELECT setval('payments_id_seq', 21, true); // Same as above
SELECT setval('payments_id_seq', 21, false); // Next nextval will return 21
The better way to avoid hard-coding of sequence name, next sequence value and to handle empty column table correctly, you can use the below way:
SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;
where table_name
is the name of the table, id
is the primary key
of the table
回答4:
setval('sequence_name', sequence_value)
来源:https://stackoverflow.com/questions/8745051/postgres-manually-alter-sequence