インデックスはDBのパフォーマンスチューニングには欠かせないものだが、その中でも中心的な
キーとなるPKを改めて確認してみました。

PRIMARY KEY は、すべてのキーカラムが NOT NULL として定義されていなければならないユニーク KEY である。
NOT NULL として明示的に定義されていないと、暗黙的(かつ自動的)に NOT NULL に設定される。
MySQL において、このキーは PRIMARY と呼ばれる。個々のテーブルは PRIMARY KEY を 1 つだけ持つことが出来る。
PRIMARY KEY がない場合に、何らかのアプリケーションがテーブルの PRIMARY KEY を要求すると、MySQL
では、NULL カラムをまったく持たない最初の UNIQUE キーが PRIMARY KEYとして返される。

複合インデックスを PRIMARY KEY にすることもできる。しかし、カラムの仕様で PRIMARY KEY キー属性
を使用して複合インデックスは作成することはできない。そのようにしても、単一のカラムがプライマリとして
マークされるにすぎない。 この場合、別に PRIMARY KEY(index_col_name, …) 節を使用する必要がある。

    インデックス確認方法

mysql> show index from テーブル名\G
mysql> desc テーブル名;

show_index

PKの追加


mysql> CREATE TABLE `Y2008` (
-> `comment` varchar(50) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> desc Y2008;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| comment | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table Y2008 add
-> constraint PK_Y2008 primary key (comment);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc Y2008;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| comment | varchar(50) | NO | PRI | | |
+---------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql>

pk

PKの削除


mysql> desc Y2008;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| comment | varchar(50) | NO | PRI | | |
+---------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> drop index `PRIMARY` on Y2008;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc Y2008;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| comment | varchar(50) | NO | | | |
+---------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql>

drop_index1


mysql> alter table Y2008 add constraint PK_Y2008 primary key (comment);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc Y2008;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| comment | varchar(50) | NO | PRI | | |
+---------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table Y2008 drop primary key;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc Y2008;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| comment | varchar(50) | NO | | | |
+---------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql>

drop_index2

——————————————————
テーブルに付与されたインデックス確認コマンド
——————————————————
mysql> show create table テーブル名;
mysql> show index from テーブル名;

table_show

——————————————————
テーブル作成時に追加する例
——————————————————

其の①
CREATE TABLE TABLE_ID(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(10)
);

其の②

CREATE TABLE TBL1 (col1 INT NOT NULL PRIMARY KEY);

其の③

CREATE TABLE TBL2 (
col1 INT NOT NULL,
col2 INT NOT NULL,
PRIMARY KEY (col1, col2)
);

index3