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

SQLiteで外部キー違反を見つける

    SQLiteには、データベース全体または特定のテーブルで外部キー違反をチェックできるPRAGMAステートメントが含まれています。

    ステートメントはPRAGMA foreign_key_checkです。 、次のように機能します。

    構文

    次の2つの方法のいずれかで使用できます。

    PRAGMA schema.foreign_key_check;
    PRAGMA schema.foreign_key_check(table-name);

    最初の行はデータベース全体をチェックし、2番目の行は特定のテーブルのみをチェックします。

    オプションのschema 引数は、接続されているデータベースまたはメインの名前を指定します またはtemp メインデータベースとTEMPデータベース用。 schemaの場合 省略、メイン が想定されます。

    それらの間に関係がある2つのテーブルを作成しましょう。

    この場合、ペット テーブルには、 TypeIdを参照する外部キーがあります タイプの列 テーブル。

    CREATE TABLE Types( 
        TypeId INTEGER PRIMARY KEY, 
        Type
    );
    
    CREATE TABLE Pets( 
        PetId INTEGER PRIMARY KEY, 
        PetName,
        TypeId,
        FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
    );

    次に、外部キー制約に違反するデータを入力しましょう。

    PRAGMA foreign_keys = OFF;
    
    INSERT INTO Types VALUES 
        ( 1, 'Dog' ),
        ( 2, 'Cat' );
    
    INSERT INTO Pets VALUES 
        ( 1, 'Homer', 3 );

    2番目のINSERT ステートメントが外部キー制約に違反しています。これは、値3を Pets.TypeIdに挿入するためです。 列、 Types.TypeIdに対応する値がない場合 列。

    ここで注意すべき重要な点は、PRAGMA foreign_keys = OFFを使用して外部キーを明示的に無効にしたことです。 。これはSQLiteのデフォルト設定ですが、この例で明確にしたかったのです。

    それでは、データベースに外部キー違反がないか確認しましょう。

    PRAGMA foreign_key_check;

    結果:

    table       rowid       parent      fkid      
    ----------  ----------  ----------  ----------
    Pets        1           Types       0         

    これは、ペットが テーブルのROWIDが1の行に外部キー違反があります。これにより、親テーブルの名前と外部キーIDもわかります。

    ペットにさらにデータを追加しましょう テーブルを作成し、チェックを再実行します。最初の2行は外部キーに準拠していますが、最後の行は準拠していません。

    INSERT INTO Pets VALUES 
        ( NULL, 'Yelp', 1 ),
        ( NULL, 'Fluff', 2 ),
        ( NULL, 'Brush', 4 );
    
    PRAGMA foreign_key_check;

    結果:

    table       rowid       parent      fkid      
    ----------  ----------  ----------  ----------
    Pets        1           Types       0         
    Pets        4           Types       0         

    データベース全体で外部キー違反をチェックすると、2つの行が返されるようになりました。

    特定のテーブルを確認する

    チェックを実行するテーブルを指定することもできます。

    ペットだけを指定するように前のチェックを書き直した例を次に示します。 テーブル。

    PRAGMA foreign_key_check(Pets);

    結果:

    table       rowid       parent      fkid      
    ----------  ----------  ----------  ----------
    Pets        1           Types       0         
    Pets        4           Types       0         

    同じ結果。

    他のテーブルを指定した場合の結果は次のとおりです。

    PRAGMA foreign_key_check(Types);

    結果:

     

    (結果がないため空白です。)

    スキーマを指定する

    前述のように、スキーマを指定することもできます。

    PRAGMA main.foreign_key_check(Pets);

    結果:

    table       rowid       parent      fkid      
    ----------  ----------  ----------  ----------
    Pets        1           Types       0         
    Pets        4           Types       0         

    私の場合はメインデータベースを使用しましたが、mainを置き換えることができます 添付されたデータベースの名前を使用します。

    外部キーを適用する方法

    前述のように、SQLiteは、強制する必要があることを明示的に指定しない限り、外部キーを強制しません。

    PRAGMA foreign_keys = ONを使用して外部キーを適用できます 。

    詳細と例については、SQLiteで外部キーサポートを有効にする方法を参照してください。


    1. justify_days()がPostgreSQLでどのように機能するか

    2. MariaDBで重複する行を削除する2つの方法(主キーを無視します)

    3. 2017年4月1日から2日までオーストリアのウィーンで開催されたMicrosoftAccessDevCon

    4. Pythonを使用してPostgresデータベースを作成する