私は質問があります。それはおそらく理論的なことです。私は、テーブルのフィールドid
をインクリメントすることで、どのように値を壊すかを理解できません。私は1つのデータベースサーバーと5つのクライアントを持っています。彼らは数時間のうちに同時にこのテーブルにデータを書き込みます。データには何千ものエントリが含まれます。Postgresのシーケンスを壊すには?
だから時にはシーケンスが壊れることがあります。私はそれが現在の値を持っていることを意味し、その最大値はid
フィールドであり、その結果、INSERT
の後にエラーが発生し、これは既存のid
の値に関連しています。
E.g。場合によっては、テーブルにid
のエントリがあり、現在の値がsequence
であり、新しいエントリのフィールドにはid
の値が返されます。そして、この現在の値は、既存のエントリの等しいid
になります。
これはクライアント側で修正されています。クエリによってエラーを処理します。
SELECT setval('table_id_seq', COALESCE((SELECT MAX(id)+1 FROM table), 1), false);
しかし、このエラーの原因を防ぐ方法を知りたいのですが。
私はLinuxコンテナ(Docker)の中で起動したpostgresql 9.5を持っています。
これはエラーではありません。シリアル/シーケンスはギャップフリーであることは保証されません。ただ彼らはギャップがないと仮定しないでください。 – wildplasser
私はこれを理解しています。しかし時にはシーケンスの現在の値は最大のidより小さくなることがあります。 – ANtlord
シーケンス(またはアプリケーション・プログラム)がシーケンスまたはターゲット列に割り当てられない場合、これは起こりません。 (もちろんラップアラウンドまで) – wildplasser