Postgresが手動でシーケンスを変更する


189

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

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


4
setval()少なくとも2つの引数があるように見えます。

回答:


262

括弧が間違っています:

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

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


2
最後の引数「true」はどういう意味ですか?
inafalcao 2017

15
true次の値は指定された数+ 1、この場合は22であるfalseことを意味します。次の値は指定された数、または21になることを意味します。デフォルトでは、setval trueは選択された場合と同様に動作します。詳細:postgresql.org/docs/9.6/static/functions-sequence.html
Tom Mertz

1
select setval構文の利点は、alter sequenceネストされたクエリを使用できることですselect max(id) from payments
mariotomo

187

この構文は、PostgreSQL のどのバージョンで無効です。

ALTER SEQUENCE payments_id_seq LASTVALUE 22

これはうまくいくでしょう:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

と同等です:

SELECT setval('payments_id_seq', 22, FALSE);

詳細については、現在のマニュアルALTER SEQUENCEおよびシーケンス関数を参照してください

setval()(regclass, bigint)またはを期待していることに注意してください(regclass, bigint, boolean)。上記の例では、型なしリテラルを提供しています。それも機能します。ただし、型付き変数を関数に渡す場合、関数の型解決を満たすために明示的な型キャストが必要になる場合があります。お気に入り:

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


4
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);機能しませんSELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);が、機能します。構文エラーが発生します。(Postgres 9.4)
NuclearPeon 2018

1
DDLコマンド(「ユーティリティコマンド」)ではサブクエリを使用できません。参照:stackoverflow.com/a/36025963/939860
Erwin Brandstetter 2018

1
@MitalPritmani:型キャストが必要になる場合があります。上記の追加の手順を検討してください。
Erwin Brandstetter 2018年

1
@NuclearPeon SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);そうでなければあなたの括弧が並んでいないことを意味すると思います。
ランド

1
@dland:余談:より短くて同等の機能:SELECT setval('seq', max(col)) FROM tbl;参照:stackoverflow.com/a/23390399/939860
Erwin Brandstetter

33

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

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

  • 最初のパラメータは sequence_name
  • 2番目のパラメーターは次です 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テーブルの


ありがとうございました!最後の表現はまさに私が探していたものです。後でバッチで挿入するためにシーケンス値を予約することができます。
ティムール


0

を介してシーケンスを変更しようとはしませんsetval。しかし、ALTER私はシーケンス名を正しく書く方法を使用して発行されました。そして、これは私にとってのみ機能します:

  1. を使用して必要なシーケンス名を確認してください SELECT * FROM information_schema.sequences;

  2. ALTER SEQUENCE public."table_name_Id_seq" restart {number};

    私の場合は ALTER SEQUENCE public."Services_Id_seq" restart 8;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.