競合を追加しても何もしないのにpostgresのシリアルが増加しています

19
Christian 2016-05-13 22:15.

私はPostgres9.5を使用していて、ここでいくつかの有線のものを見ています。

存在しない場合はレコードのリストを追加するSQLステートメントを起動するcronジョブを5分ごとに実行しています。

INSERT INTO 
   sometable (customer, balance)
VALUES
    (:customer, :balance)
ON CONFLICT (customer) DO NOTHING

sometable.customerは主キー(テキスト)です

いくつかのテーブル構造は次のとおりです
。id:シリアル
顧客:テキスト
バランス:bigint

これで、このジョブが実行されるたびに、idフィールドがサイレントに+1されるように見えます。次回は、実際にフィールドを追加します。これは、最後の値よりも数千多い数値です。このクエリは競合をチェックすると思いました。競合がある場合は何もしませんが、現在はレコードを挿入しようとし、IDを増やしてから、停止しているようです。

助言がありますか?

3 answers

20
IMSoP 2016-05-13 23:24.

これが奇妙に感じる理由は、挿入操作の一部としてカウンターの増分を考えているためです。したがって、「何もしない」は「何も増分しない」ことを意味するはずです。あなたはこれを描いています:

  1. 制約に対して挿入する値を確認します
  2. 重複が検出された場合は中止します
  3. インクリメントシーケンス
  4. データを挿入

ただし、実際には、挿入を試行する前にインクリメントを実行する必要があります。SERIALPostgresの列は、バインドされたDEFAULTnextval()関数を実行するとして実装されSEQUENCEます。DBMSがデータに対して何かを実行する前に、列の完全なセットが必要であるため、操作の順序は次のようになります。

  1. シーケンスのインクリメントを含むデフォルト値を解決します
  2. 制約に対して挿入する値を確認します
  3. 重複が検出された場合は中止します
  4. データを挿入

これは、重複するキーが自動インクリメントフィールド自体にある場合に直感的に確認できます。

CREATE TABLE foo ( id SERIAL NOT NULL PRIMARY KEY, bar text );
-- Insert row 1
INSERT INTO foo ( bar ) VALUES ( 'test' );
-- Reset the sequence
SELECT setval(pg_get_serial_sequence('foo', 'id'), 0, true);
-- Attempt to insert row 1 again
INSERT INTO foo ( bar ) VALUES ( 'test 2' )
     ON CONFLICT (id) DO NOTHING;

明らかに、これはシーケンスをインクリメントせずに競合があるかどうかを知ることができないため、そのインクリメントの後に「何もしない」必要があります。

2
Adam 2016-05-13 22:39.

@a_horse_with_no_nameと@SergeBallestaですでに述べたように、シリアルはINSERT失敗しても常にインクリメントされます。

id対応するシーケンスを変更することにより、シリアル値を使用される最大値に「ロールバック」することができます。

SELECT setval('sometable_id_seq', MAX(id), true) FROM sometable;
1
Serge Ballesta 2016-05-13 22:28.

@a_horse_with_no_nameが言ったように、それは仕様によるものです。シリアルタイプフィールドは、シーケンスを介して内部で実装されます。明らかな理由により、シーケンスから新しい値を取得すると、最後の値をロールバックすることはできません。次のシナリオを想像してみてください。

  • シーケンスはnにあります
  • Aには新しい値が必要です:n +1を取得しました
  • 並行トランザクションでは、Bは新しい値を必要とします:取得n + 2
  • 何らかの理由でAはトランザクションをロールバックします-シーケンスをリセットしても安全だと思いますか?

これが、シーケンス(およびシリアルフィールド)が、ロールバックされたトランザクションの場合に戻り値にホールが発生する可能性があることを文書化する理由です。単一性のみが保証されます。

Related questions

MORE COOL STUFF

ダイアナ妃は、8歳でウィリアム王子を寄宿学校に送るという決定に「涙を流した」

ダイアナ妃は、8歳でウィリアム王子を寄宿学校に送るという決定に「涙を流した」

ウィリアム王子が 8 歳のときに寄宿学校に通わせたことについて、ダイアナ妃がどのように感じたかを学びましょう。

シャキール・オニールは、レイカーズのスターが彼のチキン帝国を北テキサスに拡大するにつれて、ダラスの外に永住権を購入しました

シャキール・オニールは、レイカーズのスターが彼のチキン帝国を北テキサスに拡大するにつれて、ダラスの外に永住権を購入しました

Shaquille O'Neal は最近、Big Chicken レストラン帝国を拡大するため、ダラス郊外に住居を購入しました。

「90 日間の婚約者」: イヴが逮捕され、浮気スキャンダルの後、モハメドに対する家庭内暴力の容疑に直面している — 何が起こったのか?

「90 日間の婚約者」: イヴが逮捕され、浮気スキャンダルの後、モハメドに対する家庭内暴力の容疑に直面している — 何が起こったのか?

「90日の婚約者」シーズン9のスター、イヴ・アレラーノが逮捕され、モハメド・アブデルハメドへの暴行容疑で家庭内暴力の罪に問われている.

ナターシャ・リオンは、ピーウィー・ハーマンは「ビジネスで最高のGIFを送る」と言います

ナターシャ・リオンは、ピーウィー・ハーマンは「ビジネスで最高のGIFを送る」と言います

ナターシャ・リオンは、ピーウィー・ハーマン自身、ポール・ルーベンスと親密です。彼らの友情について彼女が言ったことを発見してください。

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ニューヨーク州ブルックリン、住居侵入により91歳の死者、彼の「激しい」100歳の妻が動揺

ニューヨーク州ブルックリン、住居侵入により91歳の死者、彼の「激しい」100歳の妻が動揺

ワディマンとエスリン・トンプソン(@OneRandom_Chick via Twitterスクリーンショット)「ドナルド・トランプ、スティーブ・バノン、そして 『em』ファイルで地獄の内輪に特別な場所があります」、ニューヨーク州ブルックリンの高齢者

アイスランドは、プロバイダーが望んでいないネオナチのウェブサイトであるデイリーストーマーの未来を考えています

アイスランドは、プロバイダーが望んでいないネオナチのウェブサイトであるデイリーストーマーの未来を考えています

ネオナチのウェブサイトTheDailyStormerの編集者であるAndrewAnglinが、8月にバージニア州シャーロットビルで白人の超常主義者にひかれた後に亡くなった女性を侮辱して以来、さまざまなドメインプロバイダーからウェブサイトを別の場所に移動するように言われました。地点。現在、アイスランドはドメインWebサイトを立ち上げるかどうかを検討しています。

Fortniteはそれを粉砕し続けます

Fortniteはそれを粉砕し続けます

先週末、漫画風のバトルロワイヤルゲームFortniteは、すべてのプラットフォームで340万人の同時ユーザーを襲いました。

ウォッチ:ラシダジョーンズは#MeTooとTime'sUpは包括的でなければならないと言います

ウォッチ:ラシダジョーンズは#MeTooとTime'sUpは包括的でなければならないと言います

月曜日のMakersConferenceでAvaDuVernayが司会を務めたパネルディスカッションで、ハリウッドの女性が#MeTooムーブメントとTime'sUpイニシアチブについて話し合いました。パネルは映画とテレビ業界の女性とTime'sUpイニシアチブで構成されました:ディレクターMelina Matsoukas、弁護士ニーナ・ショー、作家兼コメディアンのジル・ソロウェイ、エージェントのマハ・ダキル、俳優のナタリー・ポートマンとラシダ・ジョーンズ。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

水門の修理

水門の修理

天王星と海王星の間の領域に向かって宇宙を 3/4 g の低温で航行しながら、私たちは数週間燃え続けていました。Dawson Trawler の科学者が Yggdrasil ポータルと呼んだもの。

美しいもの

美しいもの

女性として、私は通常、関係を築くことをためらっています。私はいつも彼らに負けないように苦労しました。私は誰かと共有したいという衝動と戦わなければなりません。

逃走中の女性からの発信

最も家が必要なときに家のように感じる場所はありません。

逃走中の女性からの発信

私は誰よりも移動しました。父が住んでいた土地には、父が 1 歳馬を折るミニチュアの競馬場がありました。

死にゆく男から学んだ最大の人生の教訓

彼は、私たちが持っているのはこの現在の瞬間だけであることを知るのが遅すぎました。

死にゆく男から学んだ最大の人生の教訓

ブラッドは、カーキ色のショート パンツとポロ シャツを着たまま、白いゴルフ グローブを両手で高く引っ張ったまま、ベッドルームに入ってきました。彼は満面の笑みを浮かべながら、「今年は私の人生で最高の年だったと思います!」と言いました。通常は保守的な消費者である私たちは、通常とは異なることをしました。

Language