2012-02-16 1 views
8

私はそれが生成しているプラ​​イマリキーとの同期が外れるときにシーケンスを更新するためのソリューションを見ましたが、この問題が最初にどのように発生するのか分かりません。SQL IDシーケンスが同期しない(特にPostgresを使用する)のはなぜですか?

誰がどのように主キーフィールドへの洞察を持っています、主キーどこにも明示的に設定されていない配列のNEXTVALとして定義され、デフォルトで、シーケンスと同期して行くことができますか?私はPostgresを使用しています。シーケンスによって既存の行のIDが生成されると、結果的に重複するキー制約が発生します。

+1

いくつかの研究の後、私の特定のケースでは、実際に独自のIDを生成し、順序を無視したHibernateマッピングしました。この場合、質問を削除する必要があるかどうかはわかりません。他の人が同じ問題に遭遇したようです。 – Jake

+2

あなた自身の質問に答えることができます。あなた(またはいくつかのミドルウェア)がシーケンスを使用して一部またはすべての行の主キーを生成しない限り、シーケンスが「同期外れ」になる方法はありません。 – nos

答えて

8

あなたのアプリケーションは、おそらく時折、新しい行の主キーの値を設定しています。 postgresqlは新しいシーケンスを取得する必要はなく、シーケンスは更新されません。シーケンス番号が割り当てられると

+1

これは正しいです - 休止状態のマッピングはシーケンスを無視していたので、非休止状態のアプリケーションがシーケンスをIDを生成させる行を挿入したとき、シーケンスは古くなっていました。 – Jake

0

、それを要求したTXがロールバックされた場合でも、割り当てられたまま。そのため、安定したデータベースには表示されない番号を割り当てることができます。もちろん、行を作成した後に削除することもできます。したがって、表内の最大数はこれまで割り当てられた最大数である必要はありません。これは、任意の自動インクリメントタイプに適用されます。

また、使用される技術に応じて、個別のシーケンスは、その値がTableAのから欠落している可能性があり、複数のテーブルで使用することができますが、テーブルBに存在します。これはシーケンス名の使用ミスのためか、意図的である可能性があります。

+1

これはこの質問に対する答えではありません。 – Tometzky

関連する問題