web-dev-qa-db-ja.com

Postgresは手動でシーケンスを変更します

シーケンスを特定の値に設定しようとしています。

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

140
stef

括弧が間違っています:

SELECT setval('payments_id_seq', 21, true);  # next value will be 22

それ以外の場合は、単一の引数でsetvalを呼び出していますが、2つまたは3つ必要です。

178
NPE

この構文は、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 functionscurrentマニュアルの詳細。

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以降が必要です。

155

select setval('payments_id_seq', 21, true);を使用

setvalには3つのパラメーターが含まれます。

  • 最初のパラメーターはsequence_nameです
  • 2番目のパラメーターはNext nextval
  • 3番目のパラメーターはオプションです。

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です。

19
VaibsVB
setval('sequence_name', sequence_value)
8
Andrzej Bobak