文字列値を保持するための 1 つの列と、シーケンス番号を保持するための他の列を使用して、SQLite テーブルにデータを挿入したいと考えています。
SQLite のドキュメントによると、オートインクリメントは順次挿入を保証しないとのことです。そして、以前に挿入されたシーケンス番号を追跡したくありません。
以前に挿入された行を追跡せずに、データを順番に格納する方法はありますか?
簡単に言うと、自動インクリメントのドキュメントINTEGER PRIMARY KEY AUTOINCREMENT
では、使用していることを指摘しているように、必ずしも順番に増加しているとは限りませんが、常に増加していることが明確になっているということです。したがって、コードを変更してシーケンシャル値に依存しないようにするか(これはおそらく正しいアクションです)、独自のシーケンシャル識別子を自分で維持する必要があります。それはあなたが探している答えではないと確信していますが、それは状況の実際的な現実だと思います。
簡単な答え:AUTOINCREMENTidシーケンスのギャップについて心配するのはやめましょう。トランザクションデータベースを扱う場合、これらは避けられません。
長い答え:SQLiteは、AUTOINCREMENTが常に1つ増えることを保証できません。これは、トランザクションが原因です。
たとえば、2つのデータベース接続があり、2つの並列トランザクションがほぼ同時に開始されたとします。最初のものはいくつかのAUTOINCREMENTIDを取得し、それは以前に使用された値+1になります。1ティック後、2番目のトランザクションが次のIDを取得しました。これは現在+2です。ここで、最初のトランザクションが何らかの理由でロールバックすることを想像してください(エラーが発生した、コードがそれを中止することを決定した、プログラムがクラッシュしたなど)。その後、2番目のトランザクションはID +2をコミットし、ID番号にギャップを作成します。
では、そのような並列トランザクションの数が2を超える場合はどうなるでしょうか。予測することはできません。また、現在実行中のトランザクションに、何らかの理由で使用されなかったIDを再利用するように指示することもできません。
SQLiteデータベースにデータを順番に挿入すると、データは順番に保存されます。
ドキュメントから:the automatically generated ROWIDs are guaranteed to be monotonically increasing.
したがって、たとえば、のテーブルが必要なPerson
場合は、次のコマンドを使用して、自動インクリメントを使用してテーブルを作成できます。
CREATE table PERSON (personID integer PRIMARY KEY AUTOINCREMENT, personName string)