この記事では、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を用いてこれらの制約を効果的に活用する方法を理解することで、より堅牢なデータベース設計が可能です。
コメント