0

自動インクリメントの主キーと 25 レコード (PK は 1 から 25 まで) を持つデータベースがあるとします。PK=25 のレコードを削除します。PK 値は 1 ~ 24 になります。最後に新しいレコードを追加します。その PK 値は 25 になります。

他のテーブルが値 25 を外部キーとして使用している場合、これは非常に問題になります。それらは誤った記録にリンクされます。

この問題は通常どのように扱われますか?

4

2 に答える 2

2

ほとんどすべてのデータベースでは、一度割り当てられると、元の行が削除されても、自動インクリメント値は再利用されません。

列を AUTOINCREMENT として宣言するのではなく、組み込みの ROWID 値に依存する場合、SQLite には例外があります。2 番目のケースでは、期待どおりに動作します (値がリサイクルされることはありません)。ただし、最初のケースでは、説明した状況(最大番号の行の削除)では、値リサイクルされます。

ただし、ROWID が主キーとして使用され、他のすべての参照が強制的な外部キー関係で保護されている場合、値 25 のレコードを削除するには、最初にそれへのすべての参照を削除する必要があることを考慮してください。データベースから。

この問題は、主キー値への強制されていない参照がある場合にのみ発生します。

とはいえ、主キーを明示的に AUTOINCREMENT と宣言するのがベスト プラクティスだと思います。ここで反論を読むことができます: http://www.sqlite.org/autoinc.html

于 2013-07-17T19:03:37.717 に答える
0

一意識別子を使用できますか? 制約がなければお勧めします。

于 2013-07-17T19:08:10.680 に答える