Sqliteには、デフォルトのROWID
メカニズムまたはAUTOINCREMENT
メカニズムを使用して、データベースエンジンによって生成される単調増加プライマリキー値を作成する2つの方法があります。デフォルトのROW IDの代わりにAUTOINCREMENTを使用する必要がありますか?
sqlite> -- Through the default ROWID mechanism
sqlite> CREATE TABLE foo(id INTEGER NOT NULL PRIMARY KEY, foo);
sqlite> INSERT INTO foo (foo) VALUES ('foo');
sqlite> INSERT INTO foo (foo) VALUES ('bar');
sqlite> SELECT * FROM foo;
1|foo
2|bar
sqlite>
sqlite> -- Through the AUTOINCREMENT mechanism
sqlite> CREATE TABLE bar(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, bar);
sqlite> INSERT INTO bar (bar) VALUES ('foo');
sqlite> INSERT INTO bar (bar) VALUES ('bar');
sqlite> SELECT * FROM bar;
1|foo
2|bar
sqlite> -- Only the AUTOINCREMENT mechanism uses the sqlite_sequence table
sqlite> SELECT * FROM sqlite_sequence WHERE name in ('foo', 'bar');
bar|2
documentationがAUTOINCREMENT
を使用することは悪いことを示唆しているようだ:
AUTOINCREMENTキーワードは余分なCPU、メモリ、ディスク容量、およびディスクI/Oのオーバーヘッドを課し、厳密に必要でない場合は避けるべきです。通常は必要ありません。
INTEGER PRIMARY KEYの後にAUTOINCREMENTキーワードが表示されると、自動ROWID割り当てアルゴリズムが変更され、データベースの存続期間中にROWIDが再使用されなくなります。つまり、AUTOINCREMENTの目的は、以前に削除された行からROWIDを再利用しないようにすることです。
[AUTOINCREMENTで] SQLiteは、テーブルが "sqlite_sequence"という内部テーブルを使用して保持していた最大のROWIDを追跡します。sqlite_sequenceテーブルは、AUTOINCREMENTカラムを含む通常のテーブルが作成されると。 sqlite_sequenceテーブルの内容は、通常のUPDATE、INSERT、およびDELETEステートメントを使用して変更できます。しかし、このテーブルを変更すると、AUTOINCREMENTキー生成アルゴリズムが混乱する可能性があります。あなたがそのような変更を行う前に、あなたがしていることを知っていることを確認してください。
何のケースでは、AUTOINCREMENTキーワードを使用するのが適切でしょうか?
外部キーを有効にすると、削除された行への外部参照はできません。外部キーを無効にすると仮定すると、削除された行の外部参照を保持することをお勧めします。 –
ここで、「外部」はデータベース外を意味します。 –
申し訳ありませんが、私はまだそれを取得しない:)。外部データベースが削除されたIDへの参照を保持することはいつ便利でしょうか? –