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のステートメントは非常に制限されており、既存のテーブルに外部キーを追加することはできません。
したがって、既存のテーブルに外部キーを追加する必要がある場合は、テーブルを削除して、外部キー制約を使用してテーブルを再作成する必要があります。
テーブルに保持したいデータが含まれている場合は、外部キー制約を使用して新しいテーブルを作成した後でデータを転送する前に、そのデータを別のテーブルに転送できます。