SQLiteは、他のリレーショナルデータベース管理システムと同じようにリレーションシップをサポートします。
SQLiteはリレーショナルです データベース管理システム(RDBMS)。他の一般的なDBMS(MySQL、Oracle、SQL Server、MS Accessなど)が使用するのと同じリレーショナルモデルを使用します。
これが意味するのは、複数のテーブルを作成し、それらを関係を介して相互にリンクさせることができるということです。 。
関係 ここには、関連データを含む複数のテーブルがあり、データは両方のテーブルに格納されている共通の値によってリンクされています。
次の図は、この概念を示しています。
それでは、 Albums という別のテーブルを追加しましょう。 、それを Artists にリンクさせます 関係を介したテーブル。
これを行うと、特定のアルバムがどのアーティストに属しているかを検索できます。
新しいテーブルを作成する
それでは、先に進んで アルバム を作成しましょう。 テーブル:
CREATE TABLE Albums( AlbumId INTEGER PRIMARY KEY, AlbumName TEXT NOT NULL, Year TEXT NOT NULL, ArtistId INTEGER NOT NULL, FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) );
Artists
を作成したときと同様です ただし、このテーブルには、FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
を追加しました。 ステートメントの最後まで。
これにより、 Albums.ArtistId に外部キー制約が作成されます。 桁。つまり、この列に挿入されるデータはすべて、 Artists.ArtistId の値と一致する必要があります。 列。
そうしないと、アーティストのものではないアルバムができてしまう可能性があります。つまり、データベースに孤立したレコードが含まれている可能性があります。参照整合性を維持しようとしている場合は良くありません。
ここで、.tables
を実行すると コマンドを実行すると、データベースに両方のテーブルが表示されます。
sqlite> .tables Albums Artists
関係をテストする
外部キーを使用してテーブルを作成したら、誤ったデータを入力してテーブルをテストできます。 ArtistId を使用してアルバムの入力を試みることができます ArtistId と一致しません 参照されているテーブル(つまり、 Artists 表):
INSERT INTO Albums (AlbumName, Year, ArtistId) VALUES ('Powerslave', '1984', 70);
これにより、次のようになります。
sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId) ...> VALUES ('Powerslave', '1984', 70); Error: FOREIGN KEY constraint failed
また、SELECT
を実行します テーブルのステートメントはデータを返しません。
これは、外部キー制約が間違った値の挿入をブロックしたためです。
動作しませんでしたか?
このような誤ったデータを入力しようとしてもエラーが発生しない場合は、設定を確認する必要があります。
次のコマンドを実行します:PRAGMA foreign_keys;
その結果が0
の場合 これは、外部キー制約が無効になっていることを意味します。実際、これはSQLiteのデフォルトの動作です(下位互換性のためです)。
外部キー制約を有効にするには、次のように入力しますPRAGMA foreign_keys = ON;
ここで、PRAGMA foreign_keys;
を実行します。 1
を返す必要があります 、およびその後の無効な外部キーの挿入の試みは失敗します。
ただし、PRAGMA foreign_keys;
の場合 コマンドはデータを返しません。SQLite実装は外部キーをサポートしていません(バージョン3.6.19より古いか、SQLITE_OMIT_FOREIGN_KEY
でコンパイルされているためです。 またはSQLITE_OMIT_TRIGGER
定義済み)。
より多くのデータを挿入
関係が確立されたので、有効な外部キーを持つレコードのみが挿入されるという確信を持って、必要なだけのデータを追加できます。
INSERT INTO Albums VALUES (NULL, 'Killers', '1981', 7); INSERT INTO Albums VALUES (NULL, 'Powerslave', '1984', 7); INSERT INTO Albums VALUES (NULL, 'Surfing with the Alien', '1987', 1); INSERT INTO Albums VALUES (NULL, 'Heavy as a Really Heavy Thing', '1995', 11); INSERT INTO Albums VALUES (NULL, 'Yummy Yummy', '1994', 17); INSERT INTO Albums VALUES (NULL, 'Out of the Loop', '2007', 6); INSERT INTO Albums VALUES (NULL, 'Suck on This', '1989', 13); INSERT INTO Albums VALUES (NULL, 'Pork Soda', '1993', 13); INSERT INTO Albums VALUES (NULL, 'Sailing the Seas of Cheese', '1991', 13); INSERT INTO Albums VALUES (NULL, 'Flying in a Blue Dream', '1989', 1); INSERT INTO Albums VALUES (NULL, 'Black Swans and Wormhole Wizards', '2010', 1); INSERT INTO Albums VALUES (NULL, 'Somewhere in Time', '1986', 7); INSERT INTO Albums VALUES (NULL, 'Big Red Car', '1995', 17);
次に、JOIN
を使用して両方のテーブルからデータを選択します ステートメント。