SQLiteでユニーク制約と外部キー制約を活用する方法

この記事では、SQLiteを用いてデータベース設計を行う際の「ユニーク制約」(Unique Constraint)と「外部キー制約」(Foreign Key Constraint)の活用方法について深く解説します。Pythonでの実際のコード例とその解説、応用例を含めています。

目次

基本概念の理解

ユニーク制約と外部キー制約は、データベース設計において重要な概念です。ユニーク制約は、あるフィールドに同じ値が入らないように制約をかけます。外部キー制約は、他のテーブルとの関連性を保つために使用されます。

ユニーク制約の基本

ユニーク制約は、データベースのテーブルにおいて、特定の列にユニークな(重複しない)値を持つように制約をかけるものです。

外部キー制約の基本

外部キー制約は、リレーショナルデータベースにおいて、テーブル間の関連性を定義するための制約です。

PythonでのSQLiteの利用方法

import sqlite3

# データベースに接続
conn = sqlite3.connect("example.db")

# カーソルオブジェクトを生成
c = conn.cursor()

テーブルの作成

# テーブル作成SQL
create_table_sql = '''
CREATE TABLE IF NOT EXISTS users (
  id INTEGER PRIMARY KEY,
  name TEXT UNIQUE,
  age INTEGER
);
'''

# SQLの実行
c.execute(create_table_sql)

# コミット
conn.commit()

ユニーク制約と外部キー制約の実例

ユニーク制約の活用例

# ユニーク制約に違反するデータの挿入を試みる
try:
    c.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 30))
    c.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 25))
except sqlite3.IntegrityError as e:
    print("ユニーク制約に違反:", e)

# コミット
conn.commit()

解説

この例では、「Alice」が二回挿入されようとしていますが、ユニーク制約によって2つ目の挿入が防がれます。

外部キー制約の活用例

# 外部キー制約を設定するテーブルの作成
create_table_sql = '''
CREATE TABLE IF NOT EXISTS orders (
  id INTEGER PRIMARY KEY,
  user_id INTEGER,
  amount INTEGER,
  FOREIGN KEY(user_id) REFERENCES users(id)
);
'''

# SQLの実行
c.execute(create_table_sql)

# コミット
conn.commit()

解説

`orders`テーブルの`user_id`は`users`テーブルの`id`を参照する外部キーとして設定されています。

応用例

応用例1:一括で複数のテーブルを作成

def create_tables():
    # ユーザーテーブル
    c.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT UNIQUE,
        age INTEGER
    );
    ''')

    # 注文テーブル
    c.execute('''
    CREATE TABLE IF NOT EXISTS orders (
        id INTEGER PRIMARY KEY,
        user_id INTEGER,
        amount INTEGER,
        FOREIGN KEY(user_id) REFERENCES users(id)
    );
    ''')

    # コミット
    conn.commit()

create_tables()

応用例2:トランザクションの活用

# トランザクション開始
conn.execute("BEGIN TRANSACTION;")

try:
    c.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Bob", 40))
    c.execute("INSERT INTO orders (user_id, amount) VALUES (?, ?)", (1, 1000))
except sqlite3.IntegrityError as e:
    conn.execute("ROLLBACK;")
    print("エラーが発生:", e)
else:
    conn.execute("COMMIT;")

解説

この例では、`users`テーブルと`orders`テーブルに対する操作を一つのトランザクションとして扱っています。

まとめ

SQLiteのユニーク制約と外部キー制約は、データ整合性を保つために非常に有用です。Pythonを用いてこれらの制約を効果的に活用する方法を理解することで、より堅牢なデータベース設計が可能です。

コメント

コメントする

目次