シーケンスを特定の値に設定しようとしています。
SELECT setval('payments_id_seq'), 21, true
これによりエラーが発生します。
ERROR: function setval(unknown) does not exist
ALTER SEQUENCE
を使用しても機能しないようです。
ALTER SEQUENCE payments_id_seq LASTVALUE 22
これをどのように行うことができますか?
参照: https://www.postgresql.org/docs/current/static/functions-sequence.html
括弧が間違っています:
SELECT setval('payments_id_seq', 21, true); # next value will be 22
それ以外の場合は、単一の引数でsetval
を呼び出していますが、2つまたは3つ必要です。
この構文は、PostgreSQLのanyバージョンでは無効です:
ALTER SEQUENCE payments_id_seq LASTVALUE 22
これはうまくいくでしょう:
ALTER SEQUENCE payments_id_seq RESTART WITH 22;
と同等です:
SELECT setval('payments_id_seq', 22, FALSE);
ALTER SEQUENCE
および sequence functions のcurrentマニュアルの詳細。
setval()
は(regclass, bigint)
または(regclass, bigint, boolean)
のいずれかを想定していることに注意してください。上記の例では、型なしリテラルを提供しています。それも機能します。ただし、関数に型付き変数を渡す場合、関数型解決を満たすために明示的なtype castsが必要になる場合があります。好む:
SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);
繰り返し操作の場合は、次のことに興味があるかもしれません。
ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART; -- without value
START [WITH]
は、デフォルトのRESTART
番号を格納します。これは、値なしの後続のRESTART
呼び出しに使用されます。最後の部分にはPostgres 8.4以降が必要です。
select setval('payments_id_seq', 21, true);
を使用
setval
には3つのパラメーターが含まれます。
sequence_name
ですnextval
Setvalの3番目のパラメーターでtrueまたはfalseを使用する方法は次のとおりです。
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
シーケンス名、次のシーケンス値のハードコーディングを回避し、空の列テーブルを正しく処理するためのより良い方法は、次の方法を使用できます。
SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;
ここで、table_name
はテーブルの名前、id
はテーブルのprimary key
です。
setval('sequence_name', sequence_value)