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


82

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

現在、1000000以上の数値を生成しています。すべてをリセットして1から開始し、既存のすべてのデータをそのまま維持します。

回答:


34

ここでより良いオプションを参照してください:https//stackoverflow.com/a/5272164/5190

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

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


14
通話の前に「SELECT」を付ける必要があります。例:SELECT setval('table_id_seq', 10000)
Tom

4
そうした場合SELECT setval('table_id_seq', 1)、新しいレコードを挿入すると、IDは1ではなく値2になります。PawełGościckiのソリューションは機能します。(PostgreSQL 9.3)
青みがかった2014

@bluishおそらく何が起こったのかというと、新しい主キーが割り当てられる前にシーケンス番号がインクリメントされます。0にリセットする必要があります。しかし、とにかく他の解決策の方が優れていることに同意します。
kralyk 2017年

189

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

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

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

ALTER SEQUENCE users_id_seq RESTART WITH 1

21
WITH 1パラメータはredundandであり、ommitedすることができます
ヤツェクKrawczyk

それは本当にシーケンスをリセットするので、それが唯一の正しい答えです。
Balbinator 2018

1
CREATE TABLE句によって自動的に生成されるインデックスの大きな問題は、名前がわからないことです(そして、接尾辞は、not seq、can bypkなどです)...しかし、psqlbyでは簡単\d my_table_nameです。またはSQLで確認してくださいSELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
PeterKrauss20年

3

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

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

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

ALTER SEQUENCE menu_number_seq RESTART

仕事を完璧にします。

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