2011-01-12 11 views
6

は、私は別の結果を得ます値は1になりますが、NEXTレコード(レコードがないため実際には最初のレコード)は2です。Postgresqlのシーケンス

シーケンスの最小値が1であるため、0に設定することはできません!

私が使用:

ALTER SEQUENCE tblname_id_seq RESTART WITH 1; 

挿入された最初のレコードが実際に番号1を取得!しかし、上記のコードでは、1の代わりに値としてSELECTを受け入れません。

レコードがないときにシーケンスを番号1にリセットしたい場合、最初のレコードは1から始める必要があります。すでにテーブルにレコードがある場合は、挿入された次のレコードが{最高} +1になるようにシーケンスをリセットします。

誰もがこれに対して明確な解決策を持っていますか?それはすぐに新しいものを生成するのではなく、次nextval呼び出しのシーケンスの現在の値を返すよう

答えて

10

使用setvalの三引数形式は、偽にis_calledフラグをセットします。

http://www.postgresql.org/docs/current/interactive/functions-sequence.html

はまた、そうでない場合はシーケンスから最初の値がすでに存在して知っているMAX(id)になります、あなたはCOALESCE(MAX(id),0)+1を使用する必要があります注意してください。 (thx Stephen Denne)

+2

「COALESCE(MAX(id)、0)+1」 –

+0

を使用します。そうでない場合は、次のIDがMAX(id)と衝突します。 – araqnid

+0

これはうまくいきました。それは面倒ですが、私はそのパラメータを調べましたが、試してみるとうまくいきませんでした。私は何か間違ったことをしたに違いない... – Dylan

2

ページ下部にあるhttp://www.postgresql.org/docs/current/static/functions-sequence.htmlを参照してください。

特に、PostgreSQL 9.0では、シーケンスの値を見つけて設定できます。 setval()の3引数形式を使用して、シーケンスの現在の値または次のの値(次の値の取得時にシーケンスを1に設定できる)を設定できます。

+0

hah、1秒離れている – araqnid