1

整数の主キーまたは整数であるIDでデータをフェッチしています。

しかし、行を削除した後...

その後、selectクエリを実行してすべてを表示するとします。

ただし、1つのIDが欠落しているため、強制的にクローズします。

auto incrementID自体が&を取ることができるようにしたいdecrement

最後にレコードを削除するとき(ig id = 7)この後、行を追加すると、idは8ではなく7でなければなりません。中央の行を削除するとき(ig id = 3)と同じように、すべての行はによって自動指定されます。アクセスします。

あなたのアイデアは私を助けることができます。

4

1 に答える 1

0

自動インクリメント列を備えたほとんどのシステムは、最後に挿入された値(または次に挿入される値)を追跡し、最後に発行された番号がテーブルから削除された場合でも、番号を再発行することはありません(同じ番号を2回指定します)。 。

あなたが求めていることから判断すると、SQLiteは別のそのようなシステムです。

システムに同時実行性がある場合、これは危険ですが、シングルユーザー、一度に1つのアプリのシステムでは、次の問題を回避できる可能性があります。

SELECT MAX(id_column) + 1 FROM YourTable

次に利用可能な値を見つけます。SQLiteの動作によっては、INSERTステートメントのVALUESリストにそれを埋め込むことができる場合があります。

INSERT INTO YourTable(id_column, ...)
    VALUES((SELECT MAX(id_column) + 1 FROM YourTable), ...);

それはうまくいかないかもしれません。これは2つの操作として実行する必要がある場合があります。並行性がある場合、2つのステートメント形式は悪い考えですTMであることに注意してください。主キーの一意性制約は通常、災害を防ぎますが、2つの同時ステートメントの一方は、もう一方が挿入したばかりの値を挿入しようとするため失敗します。そのため、再試行して、最善を期待する必要があります。明らかに、携帯電話は、たとえばWebサーバーよりも同時実行性が低いため、それに応じて問題はそれほど深刻ではありません。ただし、注意してください。

ただし、全体としては、気にせずにシーケンスにギャップを表示させるのが最善です。通常、それらについて心配する必要はありません。ギャップを心配する必要がある場合は、そもそも人々にギャップを作らせないでください。または、既存の行を移動して、ギャップを作成する削除を行うときにギャップを埋めます。それでも、新しい行が追加されたときに最後に削除が残り、ギャップが作成されます。そのため、「連続した数列でなければならない」という考え方を克服するのが最善です。自動インクリメントは一意性を保証します。隣接性を保証するものではありません。

于 2011-06-15T14:12:16.943 に答える