web-dev-qa-db-ja.com

Postgres:自動インクリメントIDで行を挿入する方法

テーブル「コンテキスト」があります。自動インクリメントID「context_id」があります。シーケンスを使用して次の値を取得しています。

SELECT nextval('context_context_id_seq')

結果は次のとおりです:1、2、3、... 20 ...

しかし、「コンテキスト」テーブルには24780行あります

次の値(24781)を取得するにはどうすればよいですか?

INSERTステートメントで使用する必要があります

7
user3631472

どうやらあなたはそのテーブルに行を挿入しましたなしシーケンスを使用していて、それが同期していない理由です。

setval()を使用して、シーケンスに正しい値を設定する必要があります

_select setval('context_context_id_seq', (select max(context_id) from context));
_

次に、nextval()を次に呼び出すと、正しい値が返されます。

If列は確かにserialとして定義されています(Postgresには「自動インクリメント」はありません)。Postgresにその仕事を任せ、インサー中には決して言及しないでください。

_insert into context (some_column, some_other_column)
values (42, 'foobar');
_

context_id列のデフォルト値が適用されていることを確認します。または、次のように使用することもできます。

_insert into context (context_id, some_column, some_other_column)
values (default, 42, 'foobar');
_
20
INSERT INTO public.tablename (id, operator, text) values((SELECT MAX(id)+1 FROM public.tablename), 'OPERATOR',''); 
0
user186221