1

まず、正しい質問をしているかどうかさえわかりません。申し訳ありません。SQL は私にとって初めてのことです。次のようにSQLITEで作成したテーブルがあります。

CREATE TABLE ENTRIES "(ID INTEGER PRIMARY KEY AUTOINCREMENT,DATA BLOB NOT NULL)"

エントリの追加のみがあれば、これで問題ありません。エントリを作成すると、それらは増加します。7 つのエントリを追加したとしましょう。ここで、3 つのエントリを削除します。

DELETE FROM NODES WHERE ID = 3
DELETE FROM NODES WHERE ID = 4
DELETE FROM NODES WHERE ID = 5

私が今持っているエントリは次のとおりです。

1,2,6,7.

次回エントリを追加すると、ID=8.

だから、私の質問は:

ID 3、4、5 を取得するために次の 3 つのエントリを取得するにはどうすればよいでしょうか。これはSQL: find missing IDs in a tableに似ていることに気付きました。また、(SQL だけでなく) 一般的なプログラミングの問題でもある可能性があります。ですから、Python と SQLite のソリューションをいくつか見てみたいと思います。

ありがとう、オズ

4

2 に答える 2

0

自動インクリメントフィールドが機能する方法だとは思いません。SQLite は、最後に使用された整数のカウンターを保持します。ID の後の次の 3 行を取得する場合、削除された値を「入力」することはありません。

SELECT * FROM NODES WHERE ID > 2 LIMIT 3;

これにより、2 より大きい ID を持つ次の 3 つの行が得られます。

さらに、削除済みフラグなどを作成できますか? そのため、行がデータベースから実際に削除されることはありません。

于 2012-10-08T15:47:27.633 に答える
0

できません。データベースの整合性の理由から、SQLite は削除された ID を再利用することはありません。最初のテーブルを参照する外部キーを持つ 2 番目のテーブルがあるとします。何らかの理由で、(プライマリ ID を使用して) 参照する行も削除せずに対応する行が削除されると、間違った行を指します。

例: 購入も削除せずに個人レコードを削除すると、古い ID を再割り当てすると、購入レコードは間違った人を指します。

    ─────────────────────     ────────────────────
     Table 1 – customers       Table 2 – purchase
    ─────────────────────     ────────────────────

     *ID     <───────┐        *ID
      Name           │         Item
      Address        └───────  Customer
      Phone                    Price

これが、ほとんどすべてのデータベース エンジンがプライマリ ID を厳密にインクリメンタルに割り当てる理由です。これらはデータベースの内部構造であり、通常は触れないでください。独自の ID を割り当てる必要がある場合は、別の列を追加するだけです (そうする前によく考えてください)。

行数を追跡したい場合は、次のようにクエリを実行できますSELECT Count(*) FROM table_name

于 2012-10-08T16:11:19.977 に答える