1. ホーム
  2. postgresql

postgres の自動インクリメントが明示的な ID 挿入で更新されない

2023-09-14 05:13:29

質問

postgresに以下のようなテーブルがあります。

CREATE TABLE "test" (
    "id" serial NOT NULL PRIMARY KEY,
    "value" text
)

私は以下のような挿入を行っています。

insert into test (id, value) values (1, 'alpha')
insert into test (id, value) values (2, 'beta')

insert into test (value) values ('gamma')

最初の2つの挿入では、私は明示的にidに言及しています。しかし、この場合、テーブルの自動インクリメントポインタは更新されません。したがって、3回目の挿入でエラーが発生しました。

ERROR:  duplicate key value violates unique constraint "test_pkey"
DETAIL:  Key (id)=(1) already exists.

私はMyISAMとINNODBの両方のエンジンで、Mysqlでこの問題に直面したことはありません。明示的であろうとなかろうと、mysql は常に最大行 ID に基づいてオートインクリメントポインタを更新します。

postgres におけるこの問題の回避策は何でしょうか。私のテーブルのいくつかの ID をより厳密に制御したいので、それが必要です。

UPDATEです。 いくつかの値については、固定IDが必要だからです。他の新しいエントリのために、私は新しいものを作成することを気にしない。

を手動でインクリメントすることで可能かもしれませんね。 nextval へのポインタを max(id) + 1 を明示的に挿入しています。しかし、私はそれを行う方法がわからない。

どのように解決するのですか?

そういうことなんだ-。 next_val('test_id_seq') が呼び出されるのは、システムがこのカラムの値を必要とし、あなたが値を提供していない場合のみです。値を提供した場合、そのような呼び出しは行われず、結果的にシーケンスは "update"されません。

この問題を回避するために、手動で 設定 を手動で設定することで、この問題を回避することができます。

SELECT setval('test_id_seq', (SELECT MAX(id) from "test"));

シーケンスの名前は自動生成され、常に tablename_columnname_seq .