主キーを MySQL テーブルに追加する
 
この記事では、CREATE TABLE および ALTER TABLE ステートメントを使用して MySQL テーブルに主キーを追加する方法を紹介します。
主キーを MySQL テーブルに追加する
主キー を追加する前に、次のルールを守ることが重要です。
- 主キー フィールドの値は一意である必要があります。
- 主キーの作成に使用される列を空または NULLにすることはできません。
- MySQL サーバーは、既存の主キーを持つ新しいレコードを挿入しません。
- テーブルには 1つの主キーのみが許可されます。
CREATE TABLE ステートメントまたは ALTER TABLE ステートメントを使用して主キーを作成できます。 以下で両方を見てみましょう。
CREATE TABLE を使用して MySQL に主キーを追加する
通常、テーブルの作成時に主キーを作成します。 主キーに単一の列がある場合は、次の方法が推奨されます。
フィールド (列) 制約として主キー制約を使用します。
コード例:
CREATE TABLE students(
	ID INT NOT NULL PRIMARY KEY,
    STUDENT_NAME VARCHAR(50) NOT NULL
);
次のステートメントを使用して、主キーが確実に作成されるようにします。
DESCRIBE students;
# Alternatively, we can write as given below
DESC students;
出力:
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ID           | int         | NO   | PRI | NULL    |       |
| STUDENT_NAME | varchar(50) | NO   |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
上記の出力では、Key 列の下の PRI は、Field 列のそれぞれの値が主キーの作成に使用されていることを示しています。
複数の列を使用して主キーを作成するとします。 次に、以下のようにそれを行うことができます。
コード例:
CREATE TABLE courses(
	COURSE_ID INT NOT NULL,
    STUDENT_ID INT NOT NULL,
    COURSE_NAME VARCHAR(50) NOT NULL,
    CONSTRAINT PK_STUDENT_COURSE
   	PRIMARY KEY (COURSE_ID,STUDENT_ID)
);
DESCRIBE ステートメントを使用して、主キーが作成されているかどうかを確認します。
DESCRIBE courses
出力:
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| COURSE_ID   | int         | NO   | PRI | NULL    |       |
| STUDENT_ID  | int         | NO   | PRI | NULL    |       |
| COURSE_NAME | varchar(50) | NO   |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
3 rows in set (0.43 sec)
Key 列に 2つの PRI 値が表示されます。これは、COURSE_ID と STUDENT_ID が主キーとして使用されていることを意味します。
コンマ (,) で区切られた複数の列が含まれる場合は、主キー 制約 をテーブル (関係) 制約として使用する必要がありますが、単一の列でも使用できます。 次のクエリを参照してください。
コード例:
CREATE TABLE students(
	ID INT NOT NULL,
    STUDENT_NAME VARCHAR(50) NOT NULL,
    PRIMARY KEY(ID)
);
主キーには列が 1つしかありませんが、主キー制約をテーブル制約として使用していることに注意してください。 テーブル レベルの制約と列レベルの制約の違いについては こちら を参照してください。
ALTER TABLE を使用して MySQL に主キーを追加する
テーブルを作成した後、冗長性を避けるために、テーブル内の特定の列を主キーにする必要があることに気付きました。 その場合、ALTER TABLE ステートメントを使用します。
テーブルに主キーが含まれていない場合、このステートメントを使用すると、既存のテーブルの列に対する主キーを変更および作成できます。 ID と FULLNAME を列として持つ person テーブルがあるとします。
コード例:
# Create a table without a primary key
CREATE TABLE person(
	ID INT NOT NULL,
    FULLNAME VARCHAR(50) NOT NULL
);
# Describe `person` table
DESCRIBE person;
出力:
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| ID       | int         | NO   |     | NULL    |       |
| FULLNAME | varchar(50) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.07 sec)
上記の出力には主キーがありません。 これで、以下に示すように ALTER TABLE ステートメントを使用して、目的の列に主キーを作成できます。
コード例:
ALTER TABLE person ADD PRIMARY KEY(ID);
主キーの作成に使用されるフィールドには一意の値が必要であり、NULL または空を含めないでください。 ここで、DESCRIBE ステートメントを使用して、主キーが正常に作成されたことを確認します。
コード例:
DESCRIBE person;
出力:
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| ID       | int         | NO   | PRI | NULL    |       |
| FULLNAME | varchar(50) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.07 sec)
