リレーショナル データベースの主キーと外部キー

リレーショナル データベースの主キーと外部キー

リレーショナル データベースでは、主キーと外部キーは 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 が外部キーです。

アプリケーションシナリオ

主キーと外部キーはどちらもリレーショナル データベースの設計において非常に重要であり、データの整合性と一貫性を確保できます。主キーと外部キーのいくつかのアプリケーション シナリオを次に示します。

主キー

  1. ユーザー テーブルのユーザー ID フィールドを主キーとして使用して、各ユーザーを確実に一意にすることができます。
  2. 製品テーブルの SKU フィールドを主キーとして使用して、各製品が一意であることを確認できます。
  3. 注文テーブルの注文 ID フィールドを主キーとして使用して、各注文を確実に一意にすることができます。

外部キー

  1. 注文テーブルのユーザー ID フィールドを外部キーとして使用して、ユーザー テーブルとの関連付け関係を確立し、各注文がユーザーに対応することを確認できます。
  2. 注文詳細テーブルの注文 ID フィールドを外部キーとして使用して、注文テーブルとの関連付け関係を確立し、各注文詳細が注文に対応していることを確認できます。
  3. ショッピング カート テーブルの 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 テーブルに存在しない場合、エラーがスローされます。

要約する

リレーショナル データベースでは、主キーと外部キーは非常に重要な概念です。主キーはレコードを一意に識別するために使用され、外部キーはテーブル間の関係を確立するために使用されます。主キーと外部キーはデータの整合性と一貫性を保証することができ、データベースの設計と開発で広く使用されています。この記事では、主キーと外部キーの実際の適用シナリオをサンプル コードを通じて紹介し、読者の参考になれば幸いです。

おすすめ

転載: blog.csdn.net/JasonXu94/article/details/131653549