主キーにつyいて

# 主キーとは
主キーとは、データベースにおいて特定のテーブル内の各レコードを一意に識別するために使用されるフィールドまたはフィールドの組み合わせのことを指します。主キーは、重複する値を持つことができず、かつNULL値を持つことができないことが要件となります。
主キーは、テーブル内の他のフィールドとの関係性を表現するために使用される外部キーと対比されます。主キーを使用することで、データベース内のデータの整合性を維持することができます。
例えば、顧客テーブルにおいて顧客IDが主キーである場合、その顧客IDを参照する注文テーブルにおいて、顧客IDが誤って入力された注文を受け付けることを防ぐことができます。
また、主キーは、データの検索や並べ替えを高速化するために使用されます。主キーが設定されているテーブルにおいて、検索クエリが主キーを使用する場合、データベースは主キーインデックスを使用して、高速にレコードを検索することができます。

## 主キーの使い方
主キーは通常、数値型の列を使用することが多いですが、文字列や日付などの列も使用することができます。主キーを設定する場合は、テーブル内のレコードが一意に識別できる列を選択する必要があります。例えば、顧客テーブルにおいて、顧客の氏名を主キーとして使用することは適切ではありません。なぜなら、別の顧客が同じ名前を持つことがあり、一意性が確保されないためです。
主キーは、データベースの設計段階で決定されます。主キーの選択は、データベースの正しい動作にとって非常に重要です。主キーを選択する際には、データベースのアクセスパターンやデータの整合性を考慮する必要があります
主キーの設定方法は、データベース管理システム(DBMS)によって異なります。一般的なDBMSであるMySQLやPostgreSQLでは、主キーを設定するためのCREATE TABLE文の中で、PRIMARY KEY制約を使用することで実現されます。たとえば、以下のように記述します。

``` sql
CREATE TABLE customers ( 
 customer_id INT PRIMARY KEY,  -- customersテーブルの主キーを定義し、customer_idをINT型で指定。
 first_name VARCHAR(50),     -- first_name列をVARCHAR(50)型で定義。
 last_name VARCHAR(50),      -- last_name列をVARCHAR(50)型で定義。
 email VARCHAR(255) );       -- email列をVARCHAR(255)型で定義。;
```

この例では、customersテーブルにおいて、customer_id列が主キーとして指定されています。
また、既に存在するテーブルにおいて主キーを追加する場合は、ALTER TABLE文を使用することで実現できます。たとえば、以下のように記述します。
 ``` sql
ALTER TABLE customers ADD PRIMARY KEY (customer_id); 
 -- customersテーブルに対して、既に定義されているcustomer_id列を主キーとして追加する。
```
この例では、customersテーブルにおいて、customer_id列を主キーとして追加しています。
データベースの正しい動作とデータの整合性を維持するためには、主キーの設定方法について理解し、正しく適用することが重要です。

## 複合主キーという概念

また、主キーには複合主キーという概念もあります。複合主キーとは、複数の列を組み合わせて主キーを定義することで、複数の列の組み合わせで一意な識別子を作成することができます。複合主キーを使用する場合、列ごとに一意性が保たれていても、複合した組み合わせでの一意性が必要です。
以下は、複合主キーを使用する例です。
 ``` sql
CREATE TABLE order_details ( 
order_id INT,                 -- order_id列をINT型で定義。
product_id INT,               -- product_id列をINT型で定義。
quantity INT,                 -- quantity列をINT型で定義。
PRIMARY KEY (order_id, product_id) );  -- order_detailsテーブルの主キーを定義し、order_id列とproduct_id列の複合主キーとして設定する。
;
```
この例では、order_detailsテーブルにおいて、order_id列とproduct_id列の組み合わせが複合主キーとして指定されています。これにより、同じorder_idとproduct_idの組み合わせが複数登録されることを防ぎ、一意性を保証します。
主キーはデータベースの正しい動作とデータの整合性を保つために非常に重要です。主キーの設定方法や複合主キーの使用方法を理解することで、正しいデータベースの設計を行うことができます。

## 外部キーという概念
主キーに関連して、外部キーという概念もあります。外部キーとは、異なるテーブル間での参照関係を定義するためのキーであり、参照される側のテーブルにおいて主キーとして定義されている列を、参照する側のテーブルにおいて外部キーとして定義することで実現されます。
以下は、外部キーを使用する例です。

 ``` sql
CREATE TABLE orders ( 
order_id INT PRIMARY KEY,          -- ordersテーブルの主キーを定義し、order_idをINT型で指定。
customer_id INT,                  -- customer_id列をINT型で定義。
order_date DATE,                  -- order_date列をDATE型で定義。
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) -- customer_id列に対する外部キー制約を定義し、customersテーブルのcustomer_id列を参照する。
); 
 ``` 

この例では、ordersテーブルにおいて、customer_id列が外部キーとして指定されています。参照される側のテーブルであるcustomersテーブルにおいて、customer_id列が主キーとして定義されているため、ordersテーブルのcustomer_id列は、customersテーブルのcustomer_id列を参照することができます。
外部キーは、データベースにおいて異なるテーブル間での整合性を保つために非常に重要です。外部キー制約によって、参照される側のテーブルに存在しない値を参照することができなくなり、データの整合性が保たれます。
以上のように、主キーと外部キーは、データベースにおいて重要な役割を果たしています。正しいデータベースの設計において、主キーと外部キーの適切な設定は欠かせません。
また、主キーと外部キーには削除や更新の際の制約があります。以下は、主キーと外部キーの削除制約についての例です。

 ``` sql
CREATE TABLE orders ( 
order_id INT PRIMARY KEY,          -- ordersテーブルの主キーを定義し、order_idをINT型で指定。
customer_id INT,                  -- customer_id列をINT型で定義。
order_date DATE,                  -- order_date列をDATE型で定義。
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) -- customer_id列に対する外部キー制約を定義し、customersテーブルのcustomer_id列を参照する。
); 

```
この例では、外部キーに対してON DELETE CASCADE制約が設定されています。これは、customersテーブルからcustomer_idが削除された場合、ordersテーブルにおいてもそのcustomer_idを参照しているレコードを自動的に削除することを意味しています。

- FOREIGN KEY (customer_id)：外部キー制約の対象となるカラムを指定します。ここではcustomer_idを指定しています。
- REFERENCES customers(customer_id)：外部キー制約の参照先を指定します。ここではcustomersテーブルのcustomer_id列を参照しています。

外部キー制約を設定することで、ordersテーブルとcustomersテーブルの間にリレーションシップを定義し、データの整合性を保つことができます。

## インデックス機能
さらに、主キーと外部キーには、インデックスという機能もあります。インデックスは、データベースの検索や並び替えの速度を向上させるために使用されるもので、主キーや外部キーには自動的にインデックスが設定されます。
例えば、以下のようなテーブルがあるとします。
 ``` sql
CREATE TABLE products ( 
product_id INT PRIMARY KEY,        -- productsテーブルの主キーを定義し、product_idをINT型で指定。
product_name VARCHAR(50),         -- product_name列をVARCHAR(50)型で定義。
category_id INT,                  -- category_id列をINT型で定義。
price DECIMAL(10,2),              -- price列をDECIMAL(10,2)型で定義。
FOREIGN KEY (category_id) REFERENCES categories(category_id) -- category_id列に対する外部キー制約を定義し、categoriesテーブルのcategory_id列を参照する。
); 
```
- FOREIGN KEY (category_id)：外部キー制約の対象となるカラムを指定します。ここではcategory_idを指定しています。
- REFERENCES categories(category_id)：外部キー制約の参照先を指定します。ここではcategoriesテーブルのcategory_id列を参照しています。

このテーブルでは、主キーとしてproduct_idが設定されています。この場合、product_id列には自動的にインデックスが設定されます。また、category_id列には外部キー制約が設定されているため、category_id列にも自動的にインデックスが設定されます。
インデックスを使用することで、テーブルの検索や並び替えが高速化されます。ただし、インデックスを設定することでテーブルの更新や挿入の速度が低下する場合があるため、適切なインデックスの設定が必要です。
以上のように、主キーと外部キーはデータの整合性を保つために重要な概念であり、インデックスはデータベースの検索や並び替えの速度を向上させるために重要な機能です。データベースの設計において、適切なキーの設定とインデックスの設定が求められます。

### 削除や更新に関する制約を設定
また、主キーと外部キーには、削除や更新に関する制約を設定することができます。これにより、不正な操作を防ぐことができます。
例えば、以下のようなテーブルがあるとします。

 ``` sql
CREATE TABLE orders ( 
order_id INT PRIMARY KEY,          -- ordersテーブルの主キーを定義し、order_idをINT型で指定。
customer_id INT,                  -- customer_id列をINT型で定義。
order_date DATE,                  -- order_date列をDATE型で定義。
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE -- customer_id列に対する外部キー制約を定義し、customersテーブルのcustomer_id列を参照する。また、customersテーブルの対応する行が削除された場合に、ordersテーブルの対応する行も削除する。
); 

```
- FOREIGN KEY (customer_id)：外部キー制約の対象となるカラムを指定します。ここではcustomer_idを指定しています。
- REFERENCES customers(customer_id)：外部キー制約の参照先を指定します。ここではcustomersテーブルのcustomer_id列を参照しています。
- ON DELETE CASCADE：参照先の行が削除された場合に、このテーブルの該当行も削除することを指定します。

このテーブルでは、customer_id列に対して外部キー制約が設定されています。さらに、ON DELETE CASCADEという制約が設定されています。これは、customersテーブルの該当するレコードが削除された場合、それに紐づくordersテーブルのレコードも自動的に削除するという意味です。
このように、外部キー制約に削除や更新に関する制約を設定することで、データの整合性を保つことができます。また、不正な操作を防ぐことができるため、データの安全性も高めることができます。
以上のように、主キーと外部キーはデータベースの設計において非常に重要な概念であり、適切な制約の設定によってデータの整合性や安全性を保つことができます。

### 主キーと外部キーのメリット
主キーと外部キーは、データベースの設計において非常に重要な概念であり、以下のようなメリットがあります。
データの整合性を保つことができる 主キーと外部キーにより、テーブル間の関連付けを明確にすることができます。また、外部キー制約により、テーブル間でデータの整合性を保つことができます。たとえば、顧客と注文テーブルがある場合、顧客IDを外部キーとして注文テーブルに紐付け、顧客IDが存在しない注文を受け付けないようにすることができます。
データの検索や並び替えが高速化される 主キーと外部キーには、自動的にインデックスが設定されます。インデックスを使用することで、データの検索や並び替えが高速化されます。
データの安全性を高めることができる 外部キー制約により、不正な操作を防ぐことができます。たとえば、顧客テーブルの顧客IDが注文テーブルに存在しない場合、注文テーブルに新しいレコードを追加することができないようにすることができます。
これにより、データの安全性を高めることができます。

以上のように、主キーと外部キーはデータベースの設計において非常に重要な概念であり、データの整合性や安全性、検索性能の向上に役立ちます。データベースを設計する際には、適切なキーと制約の設定を行うことが求められます。