目次
PRIMARY KEY(主キー)とは?
PRIMARY KEYとは、値を指定することである1行を完全に特定できるという役割を担った列のことです。
会社で言えば社員番号やマイナンバーのように、番号によって個人を紐付けるイメージですね。
PRIMARY KEYは、テーブルごとに1つだけ設定できます。
列(カラム)にPRIMARY KEY制約を設定した場合、列には他の行の値と重複しない値のみ格納されるようになります。また、NULLも格納できないため、何かしらの値が格納されます。
これによって、PRIMARY KEY制約を設定した列の値を検索すると、テーブルの中で唯一のデータを特定可能です。
PRIMARY KEYの役割
PRIMARY KEYの役割は、大きく分けて次の2つあります。
- テーブルに格納されたデータの整合性を保証する
- テーブルの検索スピードを速くする
PRIMARY KEYは前述したように、他のデータと重複しないユニークな値が設定されます。
そのため、PRIMARY KEYが設定されたデータ群は整合性が保証されていると言えるのです。
また、PRIMARY KEYで検索をかけた場合、必要なデータを特定できるため検索スピードもアップします。
データベースのテーブルのほとんどは、PRIMARY KEYが設定されているといっても過言ではありません。
設定することにデメリットもなく、上記にあげた重要な役割がPRIMARY KEYにはあります。
PRIMARY KEY制約の作成方法
PRIMARY KEY制約は、基本的にテーブルを作成する際に一緒に設定します。
テーブル作成と合わせてPRIMARY KEY制約を設定する場合の書式は次の通りです。
CREATE TABLE db_name.tbl_name (col_name data_type NOT NULL PRIMARY KEY, ...)
複数のカラムと組み合わせてPRIMARY KEY制約を設定する場合は、次の通りです。
CREATE TABLE db_name.tbl_name (col_name data_type NOT NULL, ..., PRIMARY KEY(col_name, ...))
PRIMARY KEYは、カラムのデータ型の後ろに記述します。
また、PRIMARY KEYを設定するカラムには、「NOT NULL制約」の設定が必要です。
明示的に設定しなくてもエラーは発生せず、NOT NULL制約は自動的に設定されます。
では、サンプルで入力方法を確認してみましょう。
CREATE TABLE sample_tb ( user_id int NOT NULL, -- ユーザーID name varchar(20), -- 名前 age int, -- 年齢 sex varchar(10), -- 性別 PRIMARY KEY(user_id) );
「sample_tb」にユーザーID、名前、年齢、性別をもったテーブルを作成すると同時に、ユーザーID(user_id)にPRIMARY KEYを設定しました。
PRIMARY KEYの設定ができたか確認してみると、次のような形になっているはずです。
SHOW COLUMNS FROM sample_tb; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | user_id | int | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | | | sex | varchar(10) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
user_idのKeyカラムに「PRI」と表示されれば、PRIMARY KEYの設定ができています。
PRIMARY KEYを後から追加する
作成時にはPRIMARY KEYを設定せず、後から追加したい場合は、次のコマンドで設定可能です。
ALTER TABLE テーブル名 ADD PRIMARY KEY(列名);
では、先ほどのテーブルを少し変更して確認してみましょう。
CREATE TABLE sample_tb ( user_id int NOT NULL, -- ユーザーID name varchar(20), -- 名前 age int, -- 年齢 sex varchar(10) -- 性別 );
このテーブルを作成すると、テーブルの定義は次のようになっているはずです。
+---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | user_id | int | NO | | NULL | | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | | | sex | varchar(10) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
Keyカラムに「PRI」が表示されていないので、PRIMARY KEYが定義されていないのが確認できますね。
ここで、先ほど説明したALTER TABLE文で「ユーザーID(user_id)」にPRIMARY KEY制約を追加します。
ALTER TABLE sample_tb ADD PRIMARY KEY(user_id); SHOW COLUMNS FROM sample_tb; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | user_id | int | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | | | sex | varchar(10) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
上記のように、ALTER TABLE文によってuser_idにPRIMARY KEYを後から追加できました。
PRIMARY KEYを削除する
設定したPRIMARY KEY制約を削除したい場合は、次のコマンドを入力します。
ALTER TABLE テーブル名 DROP PRIMARY KEY;
こちらもサンプルで確認してみましょう。
先ほど「PRIMARY KEYを後から追加する」で追加したPRIMARY KEYを削除してみます。
ALTER TABLE sample_tb DROP PRIMARY KEY; SHOW COLUMNS FROM sample_tb; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | user_id | int | NO | | NULL | | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | | | sex | varchar(10) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
テーブルを表示してみると、PRIMARY KEYが削除されているのがわかります。
PRIMARY KEYを変更する
PRIMARY KEYを別のカラムに変更するSQLコマンドはありません。
PRIMARY KEYを変更したい場合は、一度PRIMARY KEYを削除してから新規作成もしくは追加します。
PRIMARY KEYの削除は「PRIMARY KEYを削除する」をPRIMARY KEYの追加は「PRIMARY KEYを後から追加する」を参考にしてください。
PRIMARY KEYを複数のカラムに追加する
PRIMARY KEYは、テーブルに1つのみ設定できると解説しましたが、対象になるカラムは 1つのみではなく複数のカラムを組み合わせて設定可能です。
例えば、2つのカラムを組み合わせてPRIMARY KEYを設定すると、 2つのカラムに格納された値の組み合わせは他のデータと重複しません。
ではサンプルコードでPRIMARY KEYを複数のカラムに追加してみましょう。
CREATE TABLE sample_tb ( user_id int NOT NULL, -- ユーザーID create_year int, -- 作成年 name varchar(20), -- 名前 age int, -- 年齢 sex varchar(10), -- 性別 PRIMARY KEY(user_id, create_year) );
ここでは「ユーザーID(user_id)」と「作成年(create_year)」にPRIMARY KEYを定義してみます。
複数のカラムにPRIMARY KEYを設定する場合は、カンマ区切りでつなげればOKです。
+-------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+-------+ | user_id | int | NO | PRI | NULL | | | create_year | int | NO | PRI | NULL | | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | | | sex | varchar(10) | YES | | NULL | | +-------------+-------------+------+-----+---------+-------+
user_idとcreate_yearにPRIMARY KEYが設定できました。
試しにデータを追加してみましょう。
INSERT INTO sample_tb VALUES(1, 2019, 'Abe', 33, 'Male'); INSERT INTO sample_tb VALUES(2, 2019, 'Satou', 38, 'Male'); INSERT INTO sample_tb VALUES(1, 2020, 'Kasai', 27, 'Female'); +---------+-------------+--------+------+--------+ | user_id | create_year | name | age | sex | +---------+-------------+--------+------+--------+ | 1 | 2019 | Abe | 33 | Male | | 1 | 2020 | Kasai | 27 | Female | | 2 | 2019 | Satou | 38 | Male | +---------+-------------+--------+------+--------+
PRIMARY KEYを設定した user_idとcreate_yearの値は、2つのカラムの組み合わせでは重複していないので、user_idの「1」が重複したデータでも問題ありません。
ただし、次のようにuser_idとcreate_yearの値の組み合わせが、他のデータと重複している場合はエラーになります。
INSERT INTO sample_tb VALUES(2, 2019, 'Takahashi', 31, 'Female'); ERROR 1062 (23000): Duplicate entry '2-2019' for key 'sample_tb.PRIMARY'
PRIMARY KEYをUPDATEする方法
PRIMARY KEYをUPDATE文で書き換えてみましょう。
ここでは、「PRIMARY KEYを複数のカラムに追加する」で追加したデータのuser_idを更新してみます。
UPDATE sample_tb SET user_id = user_id + 1 ORDER BY user_id DESC;
ORDER BYを設定しないと、idが重複してエラーになってしまうためidを降順に設定しています。
+---------+-------------+--------+------+--------+ | user_id | create_year | name | age | sex | +---------+-------------+--------+------+--------+ | 2 | 2019 | Abe | 33 | Male | | 2 | 2020 | Kasai | 27 | Female | | 3 | 2019 | Satou | 38 | Male | +---------+-------------+--------+------+--------+
まとめ
SQLのPRIMARY KEYについて解説しました。
PRIMARY KEYは、テーブル作成においてほぼ必須で設定する重要な機能です。
ぜひこの記事を参考にPRIMARY KEYを使いこなしてください。