MySQLで2列の主キーにAUTO_INCREMENTを設定する方法【MyISAM活用】
MySQLでは、通常AUTO_INCREMENTはテーブル内の1つの列にのみ設定できますが、MyISAMエンジンを使用すれば、複数列で構成された主キーの一部としてAUTO_INCREMENT列を定義できます。この場合、AUTO_INCREMENT列の番号は、主キーを構成するもう一方の列の値ごとに独立して採番されるのが特徴です。
2列を主キーとするテーブルの作成
まず、ENUM型の「Result」列、INT型でAUTO_INCREMENTを設定した「StudentId」列、「StudentName」列を持つテーブルを作成します。主キーは「Result」と「StudentId」の2列の組み合わせで構成し、ストレージエンジンにMyISAMを指定します。
mysql> create table TwoPrimaryKeyTableDemo
-> (
-> Result ENUM('First','Second','Third','Fail') not null,
-> StudentId int not null auto_increment,
-> StudentName varchar(200) not null,
-> Primary key(Result,StudentId)
-> )
-> ENGINE=MyISAM;
Query OK, 0 rows affected (0.20 sec)
テーブルへのレコード挿入
次に、作成したテーブルへデータを挿入します。「StudentId」は指定せず、INSERT時に自動的に採番させます。
mysql> insert into TwoPrimaryKeyTableDemo(StudentName,Result) values('John','Fail');
Query OK, 1 row affected (0.42 sec)
mysql> insert into TwoPrimaryKeyTableDemo(StudentName,Result) values('Carol','First');
Query OK, 1 row affected (0.09 sec)
mysql> insert into TwoPrimaryKeyTableDemo(StudentName,Result) values('Smith','Third');
Query OK, 1 row affected (0.05 sec)
mysql> insert into TwoPrimaryKeyTableDemo(StudentName,Result) values('Johnson','Second');
Query OK, 1 row affected (0.03 sec)
mysql> insert into TwoPrimaryKeyTableDemo(StudentName,Result) values('Johnson','Third');
Query OK, 1 row affected (0.06 sec)
mysql> insert into TwoPrimaryKeyTableDemo(StudentName,Result) values('Carol','Second');
Query OK, 1 row affected (0.18 sec)
mysql> insert into TwoPrimaryKeyTableDemo(StudentName,Result) values('Carol','Fail');
Query OK, 1 row affected (0.05 sec)SELECT文で登録内容を確認する
ORDER BY句を使って、登録されたレコードを確認してみましょう。
mysql> select * from TwoPrimaryKeyTableDemo order by StudentId,Result;
実行結果は次の通りです。
+--------+-----------+-------------+
| Result | StudentId | StudentName |
+--------+-----------+-------------+
| First | 1 | Carol |
| Second | 1 | Johnson |
| Third | 1 | Smith |
| Fail | 1 | John |
| Second | 2 | Carol |
| Third | 2 | Johnson |
| Fail | 2 | Carol |
+--------+-----------+-------------+
7 rows in set (0.00 sec)
動作のポイント
出力結果に注目すると、「StudentId」が「Result」の各値(First・Second・Third・Fail)ごとに1から連番で採番されていることが分かります。これがMyISAMならではの挙動で、AUTO_INCREMENT列は複合主キー内のもう一方の列の値ごとにグループ化され、それぞれ独立して連番が割り振られます。
なお、デフォルトのInnoDBエンジンではこの動作は利用できません。InnoDBの場合、AUTO_INCREMENT列はインデックスの先頭列である必要があるため、複合主キーの2列目に設定することはできません。このような柔軟な採番を行いたい場合はMyISAMを選択する必要がありますが、MyISAMはトランザクションやクラッシュリカバリの機能が弱いため、本番環境での採用時には十分な検討をおすすめします。
-
MySQLで主キー(AUTO_INCREMENT)をリセットする方法
MySQLで主キー(AUTO_INCREMENT)の値をリセットするには、まずTRUNCATE TABLEでテーブルを空にし、その後ALTER TABLEでAUTO_INCREMENTの開始値を設定します。この記事では、具体的な手順をサンプルコードとともに解説します。 1. サンプルテーブルの作成 まず、AUTO_INCREMENT付きの主キーを持つテーブルを作成します。 mysql> create table DemoTable1929 ( UserId int NOT NULL AUTO_INCREMENT, PRIMARY KEY(UserId) )
-
MySQLでAUTO_INCREMENT列を扱う方法を徹底解説
MySQLでは、AUTO_INCREMENT属性を使うことで、新しい行に対して自動的に一意の番号(識別子)を割り当てることができます。本記事では、AUTO_INCREMENT列の基本的な使い方、動作の仕組み、そして利用時に守るべきルールについて、実例とともにわかりやすく解説します。基本的な使い方まずは、以下のクエリを見てみましょう。テーブルを作成し、データを挿入した結果を確認します。クエリ例CREATE TABLE tableName ( id MEDIUMINT NOT NULL AUTO_INCREMENT,