主キー(プライマリーキー)の説明自体はWikipediaを参照。
参考: 主キー – Wikipedia
これをSQLで設定する方法について紹介します。
(なお、DBは MySQL やその互換のAuroraを想定しています。)
新規に作成するテーブルに設定するときは次の構文で設定できます。
参考: 13.1.7 ALTER TABLE 構文
CREATE TABLE
[テーブル名] (
[主キーの列名] [データ型] NOT NULL PRIMARY KEY,
[列名1] [データ型],
・・・
);
NOT NULL は省略可能です。省略しても主キーには自動的にNOT NULL制約が付与されます。
やってみましょう。
>CREATE TABLE
sample_table1 (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
comment VARCHAR(255)
);
Query OK, 0 rows affected (0.19 sec)
# 確認
> DESCRIBE sample_table1;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(255) | NO | | NULL | |
| comment | varchar(255) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.02 sec)
NOT NULL は省略しましたが、DESCRIBE の結果でわかる通り、id列にNOT NULL制約が入っていますね。
複数列の組み合わせで主キーを設定する場合は、次のように
PRIMARY KEY ([列名], [列名]) と言うのを書いても設定できます。
構文のイメージはこうです。もちろんですが、複数列の組み合わせでなく1列に対して設定する時もこの構文は使えます。
CREATE TABLE
[テーブル名] (
[主キーの列名1] [データ型] NOT NULL,
[主キーの列名2] [データ型] NOT NULL,
[列名1] [データ型],
・・・,
PRIMARY KEY ([主キーの列名1], [主キーの列名2])
);
例えば、 コード と 日付 に対してユニークなレコードを持つテーブルを作る場合は次のようになります。
>CREATE TABLE
sample_table2 (
code INTEGER,
date DATE,
value INTEGER,
PRIMARY KEY (code, date)
);
Query OK, 0 rows affected (0.07 sec)
> DESCRIBE sample_table2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| code | int(11) | NO | PRI | NULL | |
| date | date | NO | PRI | NULL | |
| value | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)
主キーを設定した列に対しては自動的にインデックスが作成されます。(インデックスの名前はPRIMARYになります)。
これも一応みておきましょう。
> SHOW INDEX FROM sample_table2\G
*************************** 1. row ***************************
Table: sample_table2
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: code
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: sample_table2
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 2
Column_name: date
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
あまり使わないのですが、設定されている主キーを外すときは、 ALTER TABLE 文を使います。
構文は次の通りです。
参考: 13.1.7 ALTER TABLE 構文
ALTER TABLE [テーブル名] DROP PRIMARY KEY;
やってみます。
> ALTER TABLE sample_table2 DROP PRIMARY KEY;
Query OK, 0 rows affected (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 結果確認
> DESCRIBE sample_table2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| code | int(11) | NO | | NULL | |
| date | date | NO | | NULL | |
| value | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# インデックスも消える
> SHOW INDEX FROM sample_table2\G
Empty set (0.00 sec)
インデックスは一緒に消えてしまいますが、 NOT NULL制約は残りましたね。
主キーが設定されてないテーブルに後から設定するのも ALTER TABLE 文を使います。
ALTER TABLE [テーブル名] ADD PRIMARY KEY ([列名]);
やってみます。(さっき消したキーを復活させます。)
> ALTER TABLE sample_table2 ADD PRIMARY KEY (code, date);
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 結果確認
> DESCRIBE sample_table2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| code | int(11) | NO | PRI | NULL | |
| date | date | NO | PRI | NULL | |
| value | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)