リレーショナル データベースの主キーと外部キー
リレーショナル データベースでは、主キーと外部キーは 2 つの非常に重要な概念です。主キーはレコードを一意に識別するために使用され、外部キーはテーブル間の関係を確立するために使用されます。この記事では、主キーと外部キーの概念、機能、アプリケーション シナリオを詳しく紹介し、実際のアプリケーションを示すコード例を示します。
主キー
リレーショナル データベースでは、すべてのテーブルに主キーが必要です。主キーは、レコードを一意に識別するために使用されるフィールドまたはフィールドの組み合わせです。主キーの値を繰り返すことも、NULL にすることもできません。主キーにはテーブル内の任意のフィールドを指定できますが、通常は一意のフィールドが主キーとして選択されます。たとえば、users テーブルでは、ユーザーの ID フィールドを主キーとして選択できます。
主キーの役割は、テーブル内の各レコードを確実に一意に識別できるようにすることです。これは、データのクエリ、変更、削除などの操作に非常に役立ちます。主キーがないとレコードを正確に識別できず、データベースのデータの整合性と一貫性に影響します。
主キーの定義を含むテーブルの例を次に示します。
| User ID | Username | Email | Phone |
| ------- | -------- | --------------| -------------- |
| 1 | Alice | [email protected] | 123-456-7890 |
| 2 | Bob | [email protected] | 234-567-8901 |
| 3 | Carol | [email protected] | 345-678-9012 |
この例では、ユーザー ID が主キーです。
外部キー
リレーショナル データベースでは、外部キーを使用してテーブル間の関連付けを確立します。外部キーは、別のテーブルの主キーに対応するフィールドまたはフィールドの組み合わせです。外部キーは、テーブル間のデータの整合性と一貫性を確保するために使用されます。2 つのテーブル間の関連付けは、1 つのテーブルのフィールドが別のテーブルの主キーへの外部キーとして参照されるときに確立されます。
外部キーの役割を例で説明します。2 つのテーブルがあり、1 つは user テーブル、もう 1 つは order テーブルであるとします。user テーブルには主キーとして User ID というフィールドがあり、order テーブルには外部キーとして User ID というフィールドがあり、ユーザー テーブルとの関連付け関係を確立するために使用されます。このようにして、各注文をユーザーに対応させることができ、各注文のユーザー ID がユーザー テーブルに存在する必要があります。存在しない場合、注文を挿入できません。
外部キー定義を含むテーブルの例を次に示します。
| Order ID | User ID | Order Date |
| --------| ------- | ---------- |
| 1 | 2 | 2022-01-01 |
| 2 | 1 | 2022-01-02 |
| 3 | 3 | 2022-01-03 |
この例では、ユーザー ID が外部キーです。
アプリケーションシナリオ
主キーと外部キーはどちらもリレーショナル データベースの設計において非常に重要であり、データの整合性と一貫性を確保できます。主キーと外部キーのいくつかのアプリケーション シナリオを次に示します。
主キー
- ユーザー テーブルのユーザー ID フィールドを主キーとして使用して、各ユーザーを確実に一意にすることができます。
- 製品テーブルの SKU フィールドを主キーとして使用して、各製品が一意であることを確認できます。
- 注文テーブルの注文 ID フィールドを主キーとして使用して、各注文を確実に一意にすることができます。
外部キー
- 注文テーブルのユーザー ID フィールドを外部キーとして使用して、ユーザー テーブルとの関連付け関係を確立し、各注文がユーザーに対応することを確認できます。
- 注文詳細テーブルの注文 ID フィールドを外部キーとして使用して、注文テーブルとの関連付け関係を確立し、各注文詳細が注文に対応していることを確認できます。
- ショッピング カート テーブルの SKU フィールドを外部キーとして使用して、製品テーブルとの関連付け関係を確立し、ショッピング カート内の製品がすべて有効であることを確認できます。
コード例
以下は、主キーと外部キーの動作を示す、Python と SQLite に基づくコード例です。
まず、users テーブルとorders テーブルを作成する必要があります。
import sqlite3
conn = sqlite3.connect('example.db')
# 创建用户表
conn.execute('''CREATE TABLE users
(id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
email TEXT NOT NULL,
phone TEXT NOT NULL)''')
# 创建订单表
conn.execute('''CREATE TABLE orders
(id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
order_date TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id))''')
この例では、SQLite データベースを使用し、users テーブルとorders テーブルを作成します。users テーブルの id フィールドは主キーとして定義され、orders テーブルの user_id フィールドは外部キーとして定義され、users テーブルの id フィールドに関連付けられます。
次に、users テーブルにデータを挿入します。
# 插入用户数据
conn.execute("INSERT INTO users (username, email, phone) VALUES (?, ?, ?)",
('Alice', '[email protected]', '123-456-7890'))
conn.execute("INSERT INTO users (username, email, phone) VALUES (?, ?, ?)",
('Bob', '[email protected]', '234-567-8901'))
conn.execute("INSERT INTO users (username, email, phone) VALUES (?, ?, ?)",
('Carol', '[email protected]', '345-678-9012'))
次に、orders テーブルにデータを挿入します。
# 插入订单数据
conn.execute("INSERT INTO orders (user_id, order_date) VALUES (?, ?)",
(2, '2022-01-01'))
conn.execute("INSERT INTO orders (user_id, order_date) VALUES (?, ?)",
(1, '2022-01-02'))
conn.execute("INSERT INTO orders (user_id, order_date) VALUES (?, ?)",
(3, '2022-01-03'))
この例では、order テーブルにデータを挿入します。user_id フィールドは、user テーブル内の対応するデータを指します。user_id フィールドは外部キーとして定義され、users テーブルの id フィールドに関連付けられているため、データを挿入するときに user_id フィールドの値が users テーブルに存在しない場合、エラーがスローされます。
要約する
リレーショナル データベースでは、主キーと外部キーは非常に重要な概念です。主キーはレコードを一意に識別するために使用され、外部キーはテーブル間の関係を確立するために使用されます。主キーと外部キーはデータの整合性と一貫性を保証することができ、データベースの設計と開発で広く使用されています。この記事では、主キーと外部キーの実際の適用シナリオをサンプル コードを通じて紹介し、読者の参考になれば幸いです。