sql >> データベース >  >> RDS >> SQLite

SQLiteで自動インクリメント列を作成する

    SQLiteには、自動インクリメント列を処理する興味深い方法があります。列を自動インクリメントするということは、新しいデータが挿入されるたびに自動的にインクリメントする列を意味します。

    これはIDENTITYに似ています SQLServerの列またはAUTO_INCREMENT MySQLの列 。

    この記事では、AUTOINCREMENTを作成する方法について説明します SQLiteの列。

    自動インクリメント列を自動的に作成

    デフォルトでは、列をINTEGER PRIMARY KEYとして定義する場合 、その列にNULLを挿入するたびに自動インクリメントされます。

    例:

    CREATE TABLE Cats( 
        CatId INTEGER PRIMARY KEY, 
        CatName
    );

    この表では、 CatId columnは自動インクリメント列です。これは、INTEGER PRIMARY KEYを使用して定義されているためです。 。

    ここで、その列にNULLを挿入すると、 CatId 列の自動インクリメント:

    INSERT INTO Cats VALUES 
        ( NULL, 'Brush' ),
        ( NULL, 'Scarcat' ),
        ( NULL, 'Flutter' );
    
    SELECT * FROM Cats;

    結果:

    CatId       CatName   
    ----------  ----------
    1           Brush     
    2           Scarcat   
    3           Flutter   

    AUTOINCREMENTを上書きできることに注意してください。 独自の値を挿入して値を設定します。つまり、AUTOINCREMENT そうでない場合にのみ値を挿入します。

    それが機能する方法は、NULL テーブル内の他のすべての行よりもその列の最大値より1大きい整数に自動的に変換されます。テーブルが空の場合、値は1になります 。

    列の最大値が可能な最大の整数(9223372036854775807)である場合、SQLiteは未使用のキーをランダムに選択します。これは通常、以前に削除された古いキーを再利用することを意味します。未使用のキーが見つからない場合は、INSERT SQLITE_FULLで操作が失敗する エラー。

    基本的に、これが意味するのは、DELETEを許可した場合です。 テーブル内の操作の場合、すべての行が順番に並んでいるという保証はありません。一部の行は、後日挿入された行よりも高い値になる可能性があります。

    したがって、このような場合、行が挿入された順序に基づいてテーブルを昇順または降順で並べ替える必要がある場合は、この列に依存することはできません。

    幸い、これが問題になる場合は、解決策があります。AUTOINCREMENT キーワード。

    AUTOINCREMENTキーワードを使用する

    または、AUTOINCREMENTを使用して、列を自動インクリメントに明示的に設定することもできます。 キーワード。

    この方法を使用する利点の1つは、すべての行が昇順になることが保証されることです。これは、以前に削除されたキーを再利用しないためです。各キーは常に、そのテーブルにこれまでに存在した最大のキーより1つ多くなります。可能な限り最大のキーが以前にそのテーブルに存在していた場合、そのキーは存在しません 以前に削除したキーを使用してみてください。 INSERT SQLITE_FULLで失敗します エラーコード。

    AUTOINCREMENTを使用することの欠点 キーワードは、余分なCPU、メモリ、ディスクスペース、およびディスクI/Oオーバーヘッドを使用することです。

    AUTOINCREMENTを使用して自動インクリメント列を作成する例を次に示します。 キーワード:

    CREATE TABLE Dogs( 
        DogId INTEGER PRIMARY KEY AUTOINCREMENT, 
        DogName
    );

    次に、データを挿入して選択します:

    INSERT INTO Dogs VALUES 
        ( NULL, 'Yelp' ),
        ( NULL, 'Woofer' ),
        ( NULL, 'Fluff' );
    
    SELECT * FROM Dogs;

    結果:

    DogId       DogName   
    ----------  ----------
    1           Yelp      
    2           Woofer    
    3           Fluff     

    綿毛を削除した場合 このテーブルから、新しい行を挿入します(NULLを使用) DogIdとして)、新しいDogIdは4になります。つまり、3を再利用しません。

    列がなしで作成された場合 AUTOINCREMENT キーワードの場合、次の行は3のDogIdを再利用します。

    9223372036854775807(可能な最大の整数)のDogIdを挿入すると、次の挿入時にNULLを指定する次のエラーが発生します。 その列の場合:

    Error: database or disk is full

    ただし、その値が別の行でまだ使用されていない限り、9223372036854775807よりも小さい値を明示的に挿入できます。INSERT 上記のエラーなしで操作は成功するはずです。

    基本的に、9223372036854775807に達すると、自動インクリメントは機能しなくなります。

    AUTOINCREMENTなしで定義された列 キーワードにはこの問題はありません。彼らは自動的に戻って、代わりに使用する未使用の整数を見つけようとします。ただし、すべての整数が使用されている場合(つまり、テーブルに実際に9223372036854775807行が含まれている場合)、それらの列でも上記のエラーが発生します。


    1. MySQLで文字列を「アンヘックス」する3つの方法

    2. SQLの結果をフィルタリングする方法は、多くのスルー関係になります

    3. Postgresエラー:式として使用されるサブクエリによって返される複数の行

    4. 死ぬことのないゾンビPerfMonカウンター!