SQLiteのインクリメントの主キー(自動インクリメント)

翻訳します。https://www.sqlite.org/autoinc.html
 
概要
1つのインクリメントプライマリキー(TheAUTOINCREMENTキーワード)追加のCPU、メモリ、ディスクスペースを取るので、ディスクI / Oのオーバーヘッド(ディスクI / Oのオーバーヘッドを)増やします必要でないならば、それを無効にする必要があります。通常の状況下では必要ありません。
プロパティがINTEGERPRIMARY鍵であり、ROWIDとして指定場所2 SQLiteは、効果は同じ(ROWIDの別名)で指定 ( 記憶タイプ64ビットシンボルWITHOUT_ROWID指定されたテーブルを作成する場合を除きます)整数。
挿入動作において3、またはROWID INTEGERPRIMARYのKEY列の値が指定されていない場合、それは自動的にROWID値より典型的には大きい未使用の整数で、使用されてきたSQLiteを充填します。かかわらず、AUTOINCREMENTキーワードが指定されているかどうかの、効果は同じです。
4キーワード続いINTEGEPRIMARY KEY AUTOINCREMENTキーワードは、ROWID値を使用もはや割り当てアルゴリズムのROWIDを変更しないであろう、それは行とされてきたが、AUTOINCREMENT ROWIDの再使用を防止するために、換言すれば、使用されている場合はROWID使用されていない間、データの削除、。
 
背景
SQLiteは、各テーブルの各行の64ビット符号付き整数ROWID、一意の表に表さROWIDがある(表WITHOUT_ROWID例外を指定)
 
は、特別なカラム名(例えばROWID、_rowid、缶または)SQLiteの値ROWIDアクセステーブルOID。あなたは上記の表に同じ名前の列名を定義しない限り、それが定義されている場合は、名前だけで定義された列の代わりに、構築されたROWIDに適用されます。
 
あなたはINTEGER PRIMARY KEYとして定義されたテーブルを持っている場合は、列の属性、およびROWID(の別名)と同じ効果をもたらすだろう、私は別名に変換したいのですが、おそらく誰もが理解していません。今回は、4つの異なる方法ROWIDを介してアクセスすることができ、前の段落を参照するには、3つの方法の前に、最後の一つの方法は、INTEGER PRIMARY KEY属性をその列の性質を指定することです!彼らは唯一の別名です。
 
新しい行がSQLiteのテーブルに挿入されたとき、ROWIDは、挿入ステートメントで指定、またはデータベースエンジンが自動的に割り当てさせことができます。手動の例では、ROWIDは、以下を指定し
、(INT、TEXT B)表TEST1をCREATE
TEST1 INTO INSERT(ROWID、A、B)の値(123 ,. 5、 'こんにちは');
 
INSERTステートメントは、ROWID、またはROWIDが指定されていない場合NULL値を指定し、データベースエンジンが自動的に適切なROWID値を指定します。ユニバーサルアルゴリズムは、新しいROWIDを作成し、この値は、状況の成長を反映し、以前に割り当てられたROWID値よりも大きくなります。テーブルが空の場合、ROWIDは最大のROWIDがに等しい1.Ifとして指定される最大possibleinteger(9223372036854775807)、データベースエンジンは、それが以前に使用されていないものを見つけるまでランダムにpositivecandidate ROWIDを選んで起動します。
あなたが見つからない場合ROWID値を使用していない、挿入操作は失敗に終わり、およびエラーコードSQLITE_FULLを返します!ROWIDが表示されたINSERT文で指定されていない場合は、自動的に生成されたROWID値は、常にゼロよりも大きくなっています。
 
あなたがROWIDの最大値を使用していない、と最大のROWIDデータ列を削除したことがないんとしてROWID通常の選択アルゴリズムは、限り、単調に増加すると唯一のROWIDを生成します。あなたには、いくつかの行を削除、またはそれが削除されたROWIDラインが使用される前に、最大のROWID値の1を作成する必要がある場合は、それが新しく挿入された行を再利用することができます。
 
インクリメントの主キー
列が属性INTEGER PRIMARY KEYAUTOINCREMENTプロパティ、ROWIDわずかに異なる選択アルゴリズムを指定した場合。生産ROWIDは、ROWIDのテーブル内の既存のレコードよりも大きいです。テーブルが空になる前に、ユーザは、ROWID値が最大で指定されている場合、その値はROWID 1を割り当てられている場合、それは、挿入のいずれかを許可しないと同時に、挿入操作は、任意のエラーコードが返されSQLITE_FULL 。frompreviouslyコミットされたトランザクションは考慮されている。ROWID値が戻る圧延thatwereのみROWID値は無視され、再利用することができます。
 
SQLiteは、内部ですでに使用中のテーブル最大のROWIDを記録し、名称「sqlite_sequence」テーブルを維持します。関係なく、テーブルの何も指定されたプロパティ値AUTOINCREMENTカラムが存在しない、テーブルが自動的に作成され、初期化されます。テーブルは、通常のUPDATE、INSERTを使用して編集、およびDELETEステートメントをすることができます。しかし、テーブルを変更することはAUTOINCREMENT生成アルゴリズムに影響を与えます。あなたが時間を変更すると、あなたは何をやっている知っていることを確認してください!
 
そして、指定したキーワードAUTOINCREMENTのデフォルトの実装を実現することが異なっています。AUTOINCREMENTため、同一のテーブルと同じデータベースの各列について得られたROWID値は、それが使用されることはありません。生成されたROWIDは単調に増加します。一部のアプリケーションでは、それは非常に重要な属性です。アプリケーションがこれらの属性を必要としない場合でも、あなただけの代わりにAUTOINCREMENTを指定すると、デフォルトのモードを使用することができます。挿入中のすべてのAUTOINCREMENT後に遅い遅いの挿入で、その結果、いくつかの余分な作業を行う必要があります。
 
それはROWIDが常に単調に(正確に1ずつ増加)増加し、プラス1を意味するものではありませんのでご注意ください。ゲイン1が最も一般的です。それは、挿入プロセスで失敗した場合は、シーケンスROWIDにギャップをもたらす、データの再利用に挿入され、次のROWIDを割り当てられません。AUTOINCREMENTはROWIDが自動的にインクリメントされることを保証しますが、増加の連続保証はありません。
 
AUTOINCREMENTキーワードがROWID選択アルゴリズムを変更したので、テーブル指定またはINTEGER PRIMARYKEY。エラーになり、上記2つの場合にAUTOINCREMENTキーワードを適用しようとするような他の指定AUTOINCREMENT WITHOUT_ROWIDに適用することができません。
注:
1)WITHOUT_ROWIDプロパティを指定し、あなたがAUTOINCREMENT使用することはできません
2)あなたはすでに指定されたINTEGER PRIMARY KEY属性のリストを持っている場合は、AUTOINCREMENTは、テーブルの他の列を変更することはできません。

以下は、読んでいる:
のhttp:からの抜粋//www.jb51.net/article/50049.htm
ユーザー定義の内部自己インクリメント主キー、またはシステム保守ROWIDで使用するために、上記に記載されているが、非常に明確であり、またリンクこれは、運転ROWIDの方法を提供しています。
今に焦点を当てる:著者は述べたため、大規模な分散アプリケーション、自動インクリメントの主キーには、当然のことながら、SQLiteのデータのみスズメすることができ、私たちのために、大量のデータのいずれかの概念は、ありませんこれは、スケールの概念だけでなく、2つのテーブルを使用して、深遠な好奇心を持っていますが、現在はどのオペレーティング環境を持っていません。
記事からの抜粋:主キーとして使用自己成長分野は、そこメンテナンスなど多くの問題、であるか、そのような大規模な分布として主キーの用途での紛争を解決します。
いくつかの大規模な分散アプリケーションでは、主キーは、一般的に効果的に、主キーの競合を防ぐ主キーメンテナンスプロジェクトを低減することができる、GUIDが使用されます。
もちろん、中小アプリケーションの利益のために、フィールドから簡単かつ迅速に、いくつかのより多く育ちます。
    理由は、主キーをインクリメントし、そしてどのような状況の下で、特に分散データベースでは、主キーを作成する必要があります!


おすすめ

転載: blog.51cto.com/fengyuzaitu/2429474