2017-03-12 13 views
-3

私はこのwebisteからSQLiteを学んでいます:SQLite Tutorial理解の助けが必要ですSQLite

私はAUTOINCREMENTコマンドで持っていた記事を読んでいました。

私の質問はこの機能が便利である理由 の彼らの説明をしなければならなかった

AUTOINCREMENT属性を使用する主な目的は持っている値を再利用するSQLiteのを防ぐために...

を使用されていないか、以前に削除された行から削除されます。

それはこの文の意味が何であるかを詳細に説明していないとして、私はこの説明について困惑しています。

この機能が異なるプラットフォームまたは異なるパッケージ(npmパッケージなど)のエンジンの特定のパッケージに異なる方法で実装されている場合は、誰かがバックグラウンドで何が起こるかについて詳細を教えてください。

さらに重要なことは、この機能を使用する必要があるユースケースの例と、それを使用するための適切な方法と不適切な方法の両方を挙げてください。

ありがとうございます!

+0

私は「SQLiteが*すでに使用されている値を再利用するのを防ぐ」という意味ではないと思います。サイトを書いた人が自分の名前や他の情報を追加するのに気をつけていないことを考慮して、私は塩のピンチでコンテンツを取るだろう。 –

答えて

3

SQLiteが使用されていない値を再利用しないようにするか、または以前に削除した行 からの再利用を防止します。

AUTOINCREMENT

プロパティは、その新たに生成されたIDがないその列内の任意の使用済みIDからなり、または削除されたIDとすべきでないことをユニークになり確実。今まで使用されていなかった独自のプロパティが必要なテーブルの主キーに主に使用されます。

ほとんどのリレーショナルデータベースでは、AutoIncrementというプロパティがありますが、Oracleでは、同様にAutoIncrementプロパティとして機能するSequenceがあります。

例:idと呼ばれる列がAutoIncrementの列を持ち、値が1から10までの10行がある場合は、すべての行を削除して新しい行を挿入すると、新しい行はid = 11になります。すでに使用されています。前の挿入された値をチェックすることによって、新しい行ID値を自動的に埋め込むので、id値を指定する必要はありません。

+0

シーケンスがより強力であるようです。一緒に作成し、バッチ処理のために次のX番号を取得するように要求することで、一緒に挿入された要素にギャップのない数字があることを保証できます。複数のプロセスがテーブルに書き込んでいる場合、自動インクリメントでは不可能なように見えます。 – maraca

+0

@maraca:あなたは正しいです。私の経験から、私はOracleでオートインクリメントのプロパティを見つけることができませんでしたので、私はOPにオートインクリメントとしてシーケンスの使用法を知らせたいのですが、 –

+0

はい、それは良い答えです。シーケンスは少しですがそれを使用するのは難しいです(しかし、通常はコンセプトのうちの1つしか利用できないので、選択肢はありません)。 – maraca

1

この機能は、通常、このようなテーブルの主キー(私は個人的にそれをIDに名前を付けることを好む)、で使用されている:

CREATE TABLE MYTABLE(
    ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    ... 
); 

あなたはSQLiteのを学習している場合は、絶対にそのテーブルの主キーを知っている必要がありますこのテーブルの各レコードに固有の値を設定します。 プライマリキーにAUTOINCREMENTを指定せずにテーブルにレコードを挿入する場合、データベースは新しいレコードのIDを指定するよう強制します。

テーブルにいくつかのレコードがすでにある場合は、「レコードの中にユニークであることを保証するために、どのIDを記入したらよいですか?"

これは、AUTOINCREMENTが作成されたためです。テーブルの主キーにAUTOINCREMENTが設定されている場合、レコードを挿入する際にAUTOINCREMENTを指定する必要はなくなりました。

ここで、テーブルの主キーにAUTOINCREMENTが設定されている場合、追加されたレコードの数が増えます(追加された変数という名前が付けられます)、テーブルのデータとともにデータベースに保存されますこのテーブルでINSERTコマンドを発行すると、そのIDは

added + 1 

のように計算され、追加される変数は増分になりますまず、の加算値が例えば0

ある

AkashさんKCは既に述べたように10件のレコードがテーブルに追加された場合(自動インクリメント)nted、、、次のレコードのIDは11

あろう詳細は、AUTOINCREMENTは削除を気にしません。空のテーブルを取ってそこに10個のレコードを追加し、ID 5(たとえば)の1つを削除して新しいテーブルを追加すると、そのIDも11になります。

+1

*したがって、プライマリキーにAUTOINCREMENTを指定せずにテーブルにレコードを挿入する場合、データベースは新しいレコードのIDを指定するよう強制します。 'INTEGER PRIMARY KEY'は、主キーの値を自動的に生成するようにSQLiteを設定するのに十分です。 [Documentation](http://sqlite.org/autoinc.html):INSERTの場合、ROWIDまたはINTEGER PRIMARY KEY列に明示的に値が与えられていない場合は、使用されていない整数、通常はもう1つ現在使用されている最大のROWIDよりも大きくなります。 **これは、AUTOINCREMENTキーワードが使用されているかどうかに関係なく適用されます。** – PetSerAl

+0

ああ。私はそれを知らなかった。だから私の答えは完全に間違っていますか?あなたはおそらくあなたを作るべきです –

+0

特定のIDはレコードに一度だけ与えられます。自動インクリメントは、あるレコードが別のレコードの後に​​挿入された場合に、より高いIDを持つことを保証します。ただし、削除またはロールバックによるギャップが存在する可能性があります。 – maraca

関連する問題