概要:このチュートリアルでは、主キーとは何か、およびSQL PRIMARY KEY制約を使用してテーブルに主キーを追加する方法について学習します。
SQLにおける主キーとは?
テーブルは列と行で構成されています。通常、テーブルには、テーブル内の各行を一意に識別する値を持つ列または列のセットがあります。この列または列のセットを主キーと呼びます。
2つ以上の列で構成される主キーは、複合主キーとも呼ばれます。
各テーブルには、1つだけ主キーがあります。主キーは、NULL値または重複する値を受け入れません。
次のcoursesテーブルを参照してください

course_id
列の値はcoursesテーブルの行を一意に識別するため、course_id
列はcourses
テーブルの主キーです。
主キーが2つ以上の列で構成されている場合、ある列では値が重複している可能性がありますが、主キー内のすべての列の値の組み合わせは一意である必要があります。
次のtraining
テーブルを参照してください。

training
テーブルの主キーは、employee_id
列とcourse_id
列で構成されています。
course_id
列の値は重複しています。ただし、employee_id
列とcourse_id
列の値の組み合わせは重複していません。
主キーを持つテーブルの作成
通常、テーブルを作成するときに主キーを定義します。主キーが1つの列で構成されている場合は、PRIMARY KEY制約を列制約またはテーブル制約として使用できます。主キーが2つ以上の列で構成されている場合は、PRIMARY KEY制約をテーブル制約として使用する必要があります。
データベースで会社のプロジェクトとプロジェクト割り当てを管理するとします。したがって、projects
とproject_assignments
の2つのテーブルを作成する必要があります。
次のステートメントは、projects
テーブルを作成します。
CREATE TABLE projects (
project_id INT PRIMARY KEY,
project_name VARCHAR(255),
start_date DATE NOT NULL,
end_date DATE NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
列定義にPRIMARY KEYを追加して、project_id
列をprojects
テーブルの主キーにします。
次のステートメントは上記のステートメントと同等ですが、PRIMARY KEY制約を列制約として使用する代わりに、テーブル制約を使用します。
CREATE TABLE projects (
project_id INT,
project_name VARCHAR(255),
start_date DATE NOT NULL,
end_date DATE NOT NULL,
CONSTRAINT pk_id PRIMARY KEY (project_id)
);
Code language: SQL (Structured Query Language) (sql)
CREATE TABLE
ステートメントの最後にCONSTRAINT
句を使用して、project_id
列を主キーに昇格させます。
どのプロジェクトに誰が割り当てられたかを表すプロジェクト割り当てを格納するには、次のステートメントを使用してproject_assignmentsテーブルを作成する必要があります。
CREATE TABLE project_assignments (
project_id INT,
employee_id INT,
join_date DATE NOT NULL,
CONSTRAINT pk_assgn PRIMARY KEY (project_id , employee_id)
);
Code language: SQL (Structured Query Language) (sql)
主キーは、project_id
とemployee_id
の2つの列で構成されているため、PRIMARY KEYをテーブル制約として使用する必要があります。
ALTER TABLEステートメントを使用した主キーの追加
最初に、CREATE TABLEステートメントを使用して主キーなしでテーブルを定義できますが、これは良い習慣ではありません。次に、ALTER TABLEステートメントを使用してテーブルに主キーを追加します。
たとえば、次のステートメントは、主キーなしでproject_milestones
テーブルを作成します。project_milestonesは、プロジェクトのマイルストーンを格納します。
CREATE TABLE project_milestones(
milestone_id INT,
project_id INT,
milestone_name VARCHAR(100)
);
Code language: SQL (Structured Query Language) (sql)
次に、次のALTER TABLE
ステートメントを使用して、milestone_id
列を主キーとして昇格させることができます。
ALTER TABLE project_milestones
ADD CONSTRAINT pk_milestone_id PRIMARY KEY (milestone_id);
Code language: SQL (Structured Query Language) (sql)
次のようにCONSTRAINT
句を省略できます。
ALTER TABLE project_milestones
ADD PRIMARY KEY (milestone_id);
Code language: SQL (Structured Query Language) (sql)
主キー制約の削除
テーブルの主キーを削除することはめったにありません。ただし、どうしても削除する必要がある場合は、次のようにALTER TABLEステートメントを使用できます。
ALTER TABLE table_name
DROP CONSTRAINT primary_key_constraint;
Code language: SQL (Structured Query Language) (sql)
MySQLを使用している場合、主キーを削除するための構文は次のようにより簡単です。
ALTER TABLE table_name
DROP PRIMARY KEY;
Code language: SQL (Structured Query Language) (sql)
たとえば、project_milestones
テーブルの主キー制約を削除するには、次のステートメントを使用します。
ALTER TABLE project_milestones
DROP CONSTRAINT pk_milestone_id;
Code language: SQL (Structured Query Language) (sql)
このチュートリアルでは、主キーの概念と、主キーの追加や削除など、テーブルの主キーを管理する方法について学習しました。