PostgreSQLテーブルの主キーをリセットして、データが入力されたテーブルで再び1から開始する方法はありますか?
現在、1000000以上の数値を生成しています。すべてをリセットして1から開始し、既存のすべてのデータをそのまま維持します。
回答:
ここでより良いオプションを参照してください:https://stackoverflow.com/a/5272164/5190
自動インクリメントする主キー(つまり、データ型の列serial primary key
)はシーケンスに関連付けられています。このsetval(<seqname>, <next_value>)
関数を使用して、任意のシーケンスの次の値を設定できます。実際に関数を単独で実行するにはSELECT
、次のように使用する必要があることに注意してください。SELECT setval(<seqname>, <next_value>)
シリアルを使用するときに自動作成されたシーケンスの名前は <table>_<column>_seq
SELECT setval('table_id_seq', 1)
、新しいレコードを挿入すると、IDは1ではなく値2になります。PawełGościckiのソリューションは機能します。(PostgreSQL 9.3)
シーケンスをリセットして番号1から始める最良の方法は、以下を実行することです。
ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1
したがって、たとえばusers
テーブルの場合、次のようになります。
ALTER SEQUENCE users_id_seq RESTART WITH 1
WITH 1
パラメータはredundandであり、ommitedすることができます
seq
、can bypk
などです)...しかし、psqlbyでは簡単\d my_table_name
です。またはSQLで確認してくださいSELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
@bluishは、自動インクリメントされた主キーを使用して実際に新しいレコードを挿入するのは、次のように明示的にシーケンスを使用するのと同じです。
INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)
したがって、最初のIDを1にする場合は、シーケンスを0に設定する必要があります。ただし、範囲外であるため、ALTERSEQUECEステートメントを使用する必要があります。したがって、テーブルメニューにnumberという名前のシリアルフィールドがある場合、たとえば次のようになります。
ALTER SEQUENCE menu_number_seq RESTART
仕事を完璧にします。
SELECT setval('table_id_seq', 10000)