web-dev-qa-db-ja.com

PostgreSQLの主キーを1にリセットします

PostgreSQLテーブルの主キーをリセットして、データが入力されたテーブルで再び1から開始する方法はありますか?

現在、1000000以上の数値を生成しています。既存のデータをすべてそのままにして、すべてを1にリセットして開始する必要があります。

63
David

自動インクリメントする主キー(つまり、データ型_serial primary key_の列)は、 sequence に関連付けられています。 setval(<seqname>, <next_value>)関数を使用して、任意のシーケンスに次の値を設定できます。実際に関数を単独で実行するには、次のように SELECT を使用する必要があることに注意してください:SELECT setval(<seqname>, <next_value>)

シリアルを使用するときに自動作成されたシーケンスの名前は_<table>_<column>_seq_です

30
Vinko Vrsalovic

シーケンスをリセットして番号1から開始する最良の方法は、次を実行することです。

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1

したがって、たとえばusersテーブルの場合は次のようになります。

ALTER SEQUENCE users_id_seq RESTART WITH 1
148

@bluishは、自動インクリメントされた主キーを使用して実際に新しいレコードを挿入しますが、この方法で明示的にシーケンスを使用するのと同じです。

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)

したがって、最初のIDを1にするには、シーケンスを0に設定する必要があります。ただし、範囲外なので、ALTER SEQUECEステートメントを使用する必要があります。たとえば、テーブルメニューにnumberという名前のシリアルフィールドがある場合、例:

ALTER SEQUENCE menu_number_seq RESTART

仕事を完璧にします。

1