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

SQLiteで外部キーを作成する

    SQLiteでテーブルを作成する場合、別のテーブルとの関係を確立するために外部キーを作成することもできます。

    この記事では、SQLiteでテーブルを作成するときに外部キーを作成する例を示します。

    外部キーサポートを有効にする

    最初にすべきことは、外部キーのサポートを有効にすることです(まだ行われていない場合)。

    SQLiteライブラリがないと仮定します。 SQLITE_OMIT_FOREIGN_KEYでコンパイルされました またはSQLITE_OMIT_TRIGGER 定義されている場合でも、実行時に外部キーのサポートを有効にする必要があります。

    これを行うには、次のステートメントを実行します。

    PRAGMA foreign_keys = ON;

    これにより、データベース接続の外部キーの適用が可能になります。

    別の接続を開く場合は、その接続に対して同じステートメントを実行する必要があります。

    この設定は作成には必要ないことに注意してください 外部キー。ただし、強制には必須です。 外部キー。

    外部キーのサポートが有効になったので、先に進んで外部キーを作成しましょう。

    次のデータを含む2つのテーブルが必要だとします。

    ペットと呼ばれるテーブル :

    PetId       PetName     TypeId    
    ----------  ----------  ----------
    1           Brush       3         
    2           Tweet       3         
    3           Yelp        1         
    4           Woofer      1         
    5           Fluff       2         

    タイプというテーブル s:

    TypeId      Type      
    ----------  ----------
    1           Dog       
    2           Cat       
    3           Parakeet  
    4           Hamster   

    そして、 TypeIdが必要です ペットの列 TypeIdを参照するためのテーブル タイプの列 テーブル。

    つまり、 Pets.TypeIdを作成します。 子キー(外部キー制約付き)、および Types.TypeId 親キー(主キー制約付き)。

    通常、親キーはテーブルの主キーでもありますが、これは実際には要件ではありません。この例では、これを主キーにします。

    次のコードを使用して、これら2つのテーブルを作成できます。

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

    外部キーを作成する部分は次のとおりです:

    FOREIGN KEY(TypeId) REFERENCES Types(TypeId)

    FOREIGN KEY(TypeId) 一部はPets.TypeIdを宣言します 外部キーとして。

    列名をテーブル名で修飾しませんでしたが、 Pets.TypeIdであることがわかりました。 ( Types.TypeIdではありません )これはCREATE TABLEで実行しているためです ペットの声明 。

    REFERENCES Types(TypeId) 外部キーが参照する列を指定します。この場合、 TypeIdを参照します タイプの列 テーブル。

    適切な外部キーを使用してテーブルが作成されたので、データを追加できます。

    INSERT INTO Types VALUES 
        ( NULL, 'Dog' ),
        ( NULL, 'Cat' ),
        ( NULL, 'Parakeet' ),
        ( NULL, 'Hamster' );
    
    INSERT INTO Pets VALUES 
        ( NULL, 'Brush', 3 ),
        ( NULL, 'Tweet', 3 ),
        ( NULL, 'Yelp', 1 ),
        ( NULL, 'Woofer', 1 ),
        ( NULL, 'Fluff', 2 );

    これで、テーブルに上記のデータが含まれます。

    sqlite> SELECT * FROM Pets;
    PetId       PetName     TypeId    
    ----------  ----------  ----------
    1           Brush       3         
    2           Tweet       3         
    3           Yelp        1         
    4           Woofer      1         
    5           Fluff       2         
    sqlite> SELECT * FROM Types;
    TypeId      Type      
    ----------  ----------
    1           Dog       
    2           Cat       
    3           Parakeet  
    4           Hamster   
    

    外部キー違反

    しかし、外部キーに違反するデータを挿入してみましょう。

    存在しないTypeIDを使用するペットを追加してみましょう (つまり、 TypeId タイプに存在しない値 桁)。

    INSERT INTO Pets VALUES 
        ( NULL, 'Homer', 5 );

    結果:

    Error: FOREIGN KEY constraint failed

    したがって、外部キーは、不正なデータがデータベースに入るのを防ぐことに成功しました。したがって、データの整合性を維持するのに役立ちました。

    このエラーが発生せず、データが正常に挿入された場合は、外部キーのサポートが有効になっていません。前述のように、外部キーを適用する前に、外部キーのサポートを有効にする必要があります。

    既存のテーブルへの外部キーの追加

    ALTER TABLE SQLiteのステートメントは非常に制限されており、既存のテーブルに外部キーを追加することはできません。

    したがって、既存のテーブルに外部キーを追加する必要がある場合は、テーブルを削除して、外部キー制約を使用してテーブルを再作成する必要があります。

    テーブルに保持したいデータが含まれている場合は、外部キー制約を使用して新しいテーブルを作成した後でデータを転送する前に、そのデータを別のテーブルに転送できます。


    1. エラー:参照されたテーブルバーの特定のキーに一致する一意の制約がありません

    2. Postgres.appを使用してMavericksにpggemをインストールできません

    3. Oracleパーティション表

    4. MySQLの1つを除くすべての重複行を削除しますか?