Androidアプリ開発におけるSQLiteと外部キー

2024-04-10

SQLiteで外部キー付きテーブルを作成する構文

構文

CREATE TABLE 子テーブル名 (
  子テーブルの列名 型,
  ...
  FOREIGN KEY (子テーブルの列名) REFERENCES 親テーブル名 (親テーブルの列名)
);

例:

CREATE TABLE 注文 (
  注文ID INTEGER PRIMARY KEY AUTOINCREMENT,
  顧客ID INTEGER,
  商品ID INTEGER,
  FOREIGN KEY (顧客ID) REFERENCES 顧客 (顧客ID),
  FOREIGN KEY (商品ID) REFERENCES 商品 (商品ID)
);

説明:

  • CREATE TABLE はテーブルを作成するコマンドです。
  • 子テーブル名 は作成するテーブルの名前です。
  • ( ) 内は、テーブルの列とそのデータ型を指定します。
  • FOREIGN KEY は外部キー制約を定義します。
  • (子テーブルの列名) は、外部キーとなる列の名前です。
  • REFERENCES は参照先のテーブルを指定します。

オプション

  • ON DELETE CASCADE: 親テーブルのレコードが削除された場合、子テーブルの関連するレコードも自動的に削除されます。
CREATE TABLE 注文 (
  注文ID INTEGER PRIMARY KEY AUTOINCREMENT,
  顧客ID INTEGER,
  商品ID INTEGER,
  FOREIGN KEY (顧客ID) REFERENCES 顧客 (顧客ID) ON DELETE CASCADE,
  FOREIGN KEY (商品ID) REFERENCES 商品 (商品ID) ON DELETE RESTRICT
);

SQLiteで外部キー付きテーブルを作成するには、CREATE TABLE コマンドと FOREIGN KEY 制約を使用します。外部キーは、複数のテーブル間でデータの関連性を保つために重要です。

補足

  • SQLiteは、ANSI SQL とは一部異なる構文を使用している場合があります。
  • 詳細については、SQLite の公式ドキュメントを参照してください。



-- テーブル作成
CREATE TABLE 顧客 (
  顧客ID INTEGER PRIMARY KEY AUTOINCREMENT,
  名前 TEXT,
  年齢 INTEGER
);

CREATE TABLE 注文 (
  注文ID INTEGER PRIMARY KEY AUTOINCREMENT,
  顧客ID INTEGER,
  商品ID INTEGER,
  FOREIGN KEY (顧客ID) REFERENCES 顧客 (顧客ID),
  FOREIGN KEY (商品ID) REFERENCES 商品 (商品ID)
);

CREATE TABLE 商品 (
  商品ID INTEGER PRIMARY KEY AUTOINCREMENT,
  名前 TEXT,
  価格 INTEGER
);

データ挿入

-- データ挿入
INSERT INTO 顧客 (名前, 年齢) VALUES ("山田太郎", 30);
INSERT INTO 顧客 (名前, 年齢) VALUES ("佐藤花子", 25);

INSERT INTO 商品 (名前, 価格) VALUES ("ノートパソコン", 100000);
INSERT INTO 商品 (名前, 価格) VALUES ("スマートフォン", 80000);

INSERT INTO 注文 (顧客ID, 商品ID) VALUES (1, 1);
INSERT INTO 注文 (顧客ID, 商品ID) VALUES (2, 2);

データ参照

-- データ参照
SELECT * FROM 注文;

-- 結果
-- 注文ID | 顧客ID | 商品ID
-- ------- | -------- | --------
-- 1       | 1       | 1
-- 2       | 2       | 2

SELECT 注文.注文ID, 顧客.名前, 商品.名前
FROM 注文
INNER JOIN 顧客 ON 注文.顧客ID = 顧客.顧客ID
INNER JOIN 商品 ON 注文.商品ID = 商品.商品ID;

-- 結果
-- 注文ID | 名前      | 名前
-- ------- | -------- | --------
-- 1       | 山田太郎 | ノートパソコン
-- 2       | 佐藤花子 | スマートフォン

外部キー制約の確認

-- 外部キー制約の確認
DELETE FROM 顧客 WHERE 顧客ID = 1;

-- エラー:
-- FOREIGN KEY constraint failed

外部キー制約のオプション

-- 外部キー制約のオプション

CREATE TABLE 注文 (
  注文ID INTEGER PRIMARY KEY AUTOINCREMENT,
  顧客ID INTEGER,
  商品ID INTEGER,
  FOREIGN KEY (顧客ID) REFERENCES 顧客 (顧客ID) ON DELETE CASCADE,
  FOREIGN KEY (商品ID) REFERENCES 商品 (商品ID) ON DELETE RESTRICT
);

-- 顧客ID を削除すると、関連する注文も自動的に削除される
DELETE FROM 顧客 WHERE 顧客ID = 1;

-- 商品ID を削除しようとすると、エラーが発生する
DELETE FROM 商品 WHERE 商品ID = 1;

-- エラー:
-- FOREIGN KEY constraint failed

補足

  • このサンプルコードは、SQLite 3 で動作します。
  • 他のデータベースエンジンを使用する場合は、構文が異なる場合があります。




SQLiteで外部キー付きテーブルを作成する他の方法

REFERENCES 句を使用しない方法

CREATE TABLE 注文 (
  注文ID INTEGER PRIMARY KEY AUTOINCREMENT,
  顧客ID INTEGER,
  商品ID INTEGER,
  CHECK (顧客ID IN (SELECT 顧客ID FROM 顧客)),
  CHECK (商品ID IN (SELECT 商品ID FROM 商品))
);
  • CHECK 制約を使用して、外部キー列の値が参照先のテーブルの値に存在することを確認します。

外部キートリガーを使用して、外部キー制約違反を処理することもできます。

CREATE TRIGGER 注文_顧客ID_FK
BEFORE INSERT ON 注文
FOR EACH ROW
BEGIN
  SELECT 1
  FROM 顧客
  WHERE 顧客ID = NEW.顧客ID;
END;

CREATE TRIGGER 注文_商品ID_FK
BEFORE INSERT ON 注文
FOR EACH ROW
BEGIN
  SELECT 1
  FROM 商品
  WHERE 商品ID = NEW.商品ID;
END;
  • BEFORE INSERT トリガーは、注文 テーブルにレコードが挿入される前に実行されます。
  • トリガーは、顧客 テーブルと 商品 テーブルに存在する値かどうかを確認します。

REFERENCES 句を使用する方法は、SQLiteで外部キー付きテーブルを作成する最も一般的な方法です。他の方法は非推奨または複雑なため、特別な状況でのみ使用することをお勧めします。

X 0 まとめ


sqlite android-sqlite


SQLiteでサブクエリとGROUP_CONCATで複数著者名をカンマ区切りで表示する

SQLite におけるサブクエリと GROUP_CONCAT 関数は、複雑なデータ抽出や集計処理において非常に強力なツールとなります。 このガイドでは、SELECT ステートメントの列としてサブクエリと GROUP_CONCAT を組み合わせる方法について、分かりやすく説明します。...


【完全網羅】SQLiteでNULL値を含む列にユニーク制約を設定する3つの方法と注意点

通常のUNIQUE制約では、すべての列に値が入力されている必要があるため、NULL値を含む列には設定できません。しかし、擬似列と呼ばれる特殊な列を使用することで、NULL値を含む複数の列にユニーク制約を設定することができます。擬似列の作成: まず、ユニーク制約を設定したい列の値を結合した文字列を保持する擬似列を作成します。 この擬似列は、テーブル定義内にVIRTUALキーワードを使用して作成します。...


【初心者向け】LaravelマイグレーションにおけるSQLiteでの「NOT NULL列にデフォルト値NULLを追加できない」エラーの分かりやすい解決策

LaravelでSQLiteを使用する場合、マイグレーション時に「NOT NULL列にデフォルト値NULLを追加できない」というエラーが発生することがあります。これは、SQLiteの仕様とLaravelのマイグレーション機能の不一致が原因です。...


SQLiteでアクセント付き文字列を正しくソートする方法:完全ガイド

COLLATE を使用する最も一般的な方法は、COLLATE キーワードを使用して、列のソート順序を指定することです。 COLLATE には、さまざまなロケールやソートアルゴリズムを指定できます。例:この例では、name 列は unicode ロケールでソートされます。 unicode ロケールは、Unicode 標準に従って文字列をソートします。...


SQL SQL SQL SQL Amazon で見る



プログラミング初心者でも安心!Androidアプリ開発における外部キー制約

Androidアプリ開発において、SQLiteデータベースは重要な役割を果たします。データベースの整合性を保ち、関連データ間の参照を容易にするために、外部キー制約と呼ばれる機能が役立ちます。外部キー制約は、あるテーブルの列の値が、別のテーブルの列を参照することを保証するものです。例えば、顧客テーブルと注文テーブルがあるとします。顧客テーブルには顧客ID、氏名、住所などの情報が格納され、注文テーブルには注文ID、顧客ID、商品ID、注文日時などの情報が格納されます。