2

文字列値を保持するための 1 つの列と、シーケンス番号を保持するための他の列を使用して、SQLite テーブルにデータを挿入したいと考えています。

SQLite のドキュメントによると、オートインクリメントは順次挿入を保証しないとのことです。そして、以前に挿入されたシーケンス番号を追跡したくありません。

以前に挿入された行を追跡せずに、データを順番に格納する方法はありますか?

4

3 に答える 3

1

簡単に言うと、自動インクリメントのドキュメントINTEGER PRIMARY KEY AUTOINCREMENTでは、使用していることを指摘しているように、必ずしも順番に増加しているとは限りませんが、常に増加していることが明確になっているということです。したがって、コードを変更してシーケンシャル値に依存しないようにするか(これはおそらく正しいアクションです)、独自のシーケンシャル識別子を自分で維持する必要があります。それはあなたが探している答えではないと確信していますが、それは状況の実際的な現実だと思います。

于 2012-12-24T07:38:14.340 に答える
1

簡単な答え:AUTOINCREMENTidシーケンスのギャップについて心配するのはやめましょう。トランザクションデータベースを扱う場合、これらは避けられません。

長い答え:SQLiteは、AUTOINCREMENTが常に1つ増えることを保証できません。これは、トランザクションが原因です。

たとえば、2つのデータベース接続があり、2つの並列トランザクションがほぼ同時に開始されたとします。最初のものはいくつかのAUTOINCREMENTIDを取得し、それは以前に使用された値+1になります。1ティック後、2番目のトランザクションが次のIDを取得しました。これは現在+2です。ここで、最初のトランザクションが何らかの理由でロールバックすることを想像してください(エラーが発生した、コードがそれを中止することを決定した、プログラムがクラッシュしたなど)。その後、2番目のトランザクションはID +2をコミットし、ID番号にギャップを作成します。

では、そのような並列トランザクションの数が2を超える場合はどうなるでしょうか。予測することはできません。また、現在実行中のトランザクションに、何らかの理由で使用されなかったIDを再利用するように指示することもできません。

于 2012-12-25T09:31:15.430 に答える
0

SQLiteデータベースにデータを順番に挿入すると、データは順番に保存されます。

ドキュメントから:the automatically generated ROWIDs are guaranteed to be monotonically increasing.

したがって、たとえば、のテーブルが必要なPerson場合は、次のコマンドを使用して、自動インクリメントを使用してテーブルを作成できます。

CREATE table PERSON (personID integer PRIMARY KEY AUTOINCREMENT, personName string)

リンク:http ://www.sqlite.org/autoinc.html

于 2012-12-24T07:42:30.520 に答える