2016-10-02 3 views
2

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 

documentationAUTOINCREMENTを使用することは悪いことを示唆しているようだ:

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キーワードを使用するのが適切でしょうか?

答えて

2

ドキュメントは

AUTOINCREMENTの目的は、以前に削除された行のROWIDからの再使用を防止することであると述べています。

したがって、以前に削除された行からROWIDを再利用しないようにする必要がある場合は、AUTOINCREMENTキーワードを使用することが適切です。これらの削除された行への外部参照があり、それらを新しい行と混同しないでください。

+0

外部キーを有効にすると、削除された行への外部参照はできません。外部キーを無効にすると仮定すると、削除された行の外部参照を保持することをお勧めします。 –

+0

ここで、「外部」はデータベース外を意味します。 –

+0

申し訳ありませんが、私はまだそれを取得しない:)。外部データベースが削除されたIDへの参照を保持することはいつ便利でしょうか? –

関連する問題