主キーを 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)