postgresの自動インクリメントカウンターをリセットする


232

テーブルの自動インクリメントフィールドをある値に強制したいので、これを試してみました:

ALTER TABLE product AUTO_INCREMENT = 1453

そして

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

私はpostgresに不慣れです:(

フィールドを持つテーブルproductIdありnameます


5
新規の場合、なぜpgAdminを使用せず、生成されるコマンドを調べますか
Unreason

1
通常、テーブルは製品「のようにしていない『の製品のような名前が付けられていproducts_id_seq『あなたは正しい順序を探していることを確認してください』この場合、あなたの順序は次のように命名されます。』。。
アレクサンダーがgorg

回答:


309

列をproduct持つテーブルを作成した場合id、シーケンスは単に呼び出されるのproductではなく、product_id_seq(つまり${table}_${column}_seq)と呼ばれます。

これはALTER SEQUENCEあなたが必要とするコマンドです:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

\dspsql のコマンドを使用して、データベース内のシーケンスを確認できます。そうした場合\d product、あなたの列のデフォルトの制約を見て、nextval(...)呼び出しがあまりにもシーケンス名を指定します。


66
このメッセージから正しい構文が何であるかは明らかではありません。ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Liron Yahdav、2012年

7
上記をうまく解析できなかったからといって、まったく同じことを言い換える私の方法は次のとおりです。構文はALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #です。「seq」はリテラルテキストで、#には番号を付けます。アンダースコアを無視しないでください。:-)
kmort

2
パブリックスキーマを使用しない場合は、my_schemaをプレフィックスとして付ける必要があることに注意してください。ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
ダニエルL.ヴァンデンボッシュ

ALTER SEQUENCE product_id_seq RESTART WITH(SELECT MAX(id)from product);なぜ誰かが知っていますか?動作しませんか?私が見つけた唯一の方法は、2つの個別のクエリを使用することです。
Chris Huang-Leaver 2018

8
再起動する値は、次に使用する値であることに注意してください。したがって、すでにidを持つレコードがある1453場合は、それを行う必要がありRESTART WITH 1454ます。
ヒューズ

144

これは、製品テーブルのシーケンスがproduct_id_seqであると想定して、探しているコマンドです。

ALTER SEQUENCE product_id_seq RESTART WITH 1453;


130

次のコマンドは、これを自動的に実行します。これにより、テーブル内のすべてのデータも削除されます。ので注意してください。

TRUNCATE TABLE someTable RESTART IDENTITY;

21
注意-これによりすべてのデータも削除されます
kibibu 2013年

28
@Loolooii、フラグを立てるだけ。SQLに慣れていない人が自動インクリメントフィールドのあるテーブルに行を手動で追加したため(ORMなどを介して)、ここで検索している場合、このソリューションはおそらく期待したものではありません。
kibibu 2013年

1
TABLEキーワードは冗長です。TRUNCATE someTable RESTART IDENTITY;十分です
user1 2016年

CASCADEでこれをどのように行うか考えていますか?
ihossain

2
@ihossain試しましたTRUNCATE someTable RESTART IDENTITY CASCADE;か?
Vedran

55

シーケンスカウンターを設定するには:

setval('product_id_seq', 1453);

シーケンス名がわからない場合は、次のpg_get_serial_sequence関数を使用します。

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

パラメータは、テーブル名と列名です。

または\d productpsqlプロンプトで単にa を発行します。

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

-シーケンスの開始値を変更します

ALTER SEQUENCE project_id_seq RESTART 3000;

同じですが動的です:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

SELECTの使用は厄介ですが、機能します。

ソース:https : //kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


私が間違っていなければ、PGはlast_valueとis_calledでシーケンスを表し、(1、false)で始まり、次に(1、true)、(2、true)...なので、MAX(id)+ 1はMAX (id)代わりにidをスキップしません。
テン

これを機能させるには、postgresインスタンスも再起動する必要がありました。brew services restart postgresql
BigRon

SELECT SETVAL( 'project_id_seq'、(SELECT MAX(id)+ 1 FROM project)); 完全に動作しますが、増分値を0にリセットする方法はありますか?新しいエントリは0インデックスで始まりますか?
Charith Jayasanka

13

訪問者の便宜のためコメントから変換

このメッセージから正しい構文が何であるかは明らかではありません。それは:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

GUIから自動増分をリセットする場合は、次の手順に従います。

  1. データベースに移動します
  2. Publicをクリックします
  3. テーブルのリストページには、「テーブル」、「ビュー」、「シーケンス」などのタブが表示されます。
  4. シーケンスをクリックします
  5. 「シーケンス」をクリックすると、すべてのシーケンスリストが表示され、リセットしたいものをクリックします。
  6. その後、「Alter」、「Set Value」、「Restart」、「Reset」などの複数の選択肢が表示されます。
  7. 次に[ リセット ]をクリックし、新しい行を1つ追加します。

6

次の値をリセットするIDENTITY列を持つテーブルがある場合は、次のコマンドを使用できます。

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
sequenceテーブルがない場合、またはテーブルを切り捨てることができない場合の使いやすさのために1つ+ 。私はそれが最良の答えだと思います
ABS

5

自動インクリメントをリセットするには、次のクエリを使用してシーケンス名を取得する必要があります。

構文:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

例:

SELECT pg_get_serial_sequence('demo', 'autoid');

クエリは、autoidのシーケンス名を"Demo_autoid_seq"として返し ます。次のクエリを使用して、autoidをリセットします

構文:

ALTER SEQUENCE sequenceName RESTART WITH value;

例:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

シーケンスIDを取得するには

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

これにより、sequesce IDがtableName_ColumnName_seqになります。

最後のシード番号を取得するには

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

または、シーケンスIDがすでに直接使用されていることがわかっている場合。

select currval(tableName_ColumnName_seq);

最後のシード番号が表示されます

シード番号をリセットするには

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

このクエリを使用して、スキーマとテーブルのシーケンスキーを確認します。

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

このクエリを使用して、増分値を1つずつ増やし、

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

テーブルに挿入すると、次の増分値がキー(111)として使用されます。

このクエリを使用して、増分値として特定の値を設定します

SELECT setval('"SchemaName"."SequenceKey"', 120);

テーブルに挿入すると、次の増分値がキー(121)として使用されます。


0

「_」を含むテーブル名がある場合、シーケンス名から削除されることに注意してください。

たとえば、テーブル名:user_tokens列:idシーケンス名:usertokens_id_seq

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