MySQLでテーブルの複数カラムにPRIMARY KEY(複合主キー)を設定する方法
実は、MySQLでは複数のカラムに対してPRIMARY KEY(主キー)を設定することが可能です。これを「複合主キー」と呼びます。この方法の利点は、複数のカラムをひとつのまとまり(エンティティ)として扱える点にあります。つまり、複数カラムの値の組み合わせがテーブル内で一意になることが保証されます。
複合主キーの作成例
以下のように、CREATE TABLE文で複数のカラムにPRIMARY KEYを定義して、テーブル「allotment」を作成してみましょう。ここでは「RollNo」と「RoomNo」の2つのカラムを組み合わせて主キーとしています。
mysql> CREATE TABLE allotment(
-> RollNo INT,
-> Name VARCHAR(20),
-> RoomNo INT,
-> PRIMARY KEY(RollNo, RoomNo)
-> );
Query OK, 0 rows affected (0.23 sec)
DESCRIBEコマンドでテーブル構造を確認すると、両方のカラムのKey欄に「PRI」が表示され、複合主キーが正しく設定されていることがわかります。
mysql> DESCRIBE allotment; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | RollNo | int(11) | NO | PRI | 0 | | | Name | varchar(20) | YES | | NULL | | | RoomNo | int(11) | NO | PRI | 0 | | +--------+-------------+------+-----+---------+-------+ 3 rows in set (0.10 sec)
重複データ挿入時の動作
複合主キーが設定された状態で、主キーを構成するカラムの値の組み合わせが重複するデータを挿入しようとすると、MySQLはエラーを返します。以下の例では、1行目と3行目で「RollNo = 1」「RoomNo = 201」という同じ組み合わせが発生しているため、エラーとなっています。
mysql> INSERT INTO allotment VALUES(1, 'Aarav', 201),(2,'Harshit',201),(1,'Rahul',201); ERROR 1062 (23000): Duplicate entry '1-201' for key 'PRIMARY'
このように、複合主キーを使用することで、単一カラムでは一意性を保証できない場合でも、複数カラムの組み合わせによってデータの一意性を確保できます。なお、注意点として、複合主キーを構成する各カラムにはNULL値を格納できず、必ず値を設定する必要があります。
-
MySQLデータベースのテーブルで複合主キーを識別する方法
MySQLでテーブルに複合主キー(コンポジットプライマリーキー)が設定されているかどうかを確認したい場合、information_schema.KEY_COLUMN_USAGE テーブルに対して集計関数 COUNT(*) を使用する方法が便利です。クエリの結果が1より大きい値を返した場合、そのテーブルには複数のカラムから構成される複合主キーが設定されていることになります。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable1324 -> ( -> StudentId int, ->
-
MySQLで別テーブルの主キーを外部キーとして参照する方法をわかりやすく解説
MySQLでは、あるテーブルの主キー(PRIMARY KEY)を、別のテーブルの外部キー(FOREIGN KEY)として参照することで、テーブル間にリレーション(関連付け)を構築できます。これによりデータの整合性が保たれ、参照先に存在しない値の登録を防ぐことができます。外部キー制約を追加する基本構文既存のテーブルに対して外部キー制約を追加するには、ALTER TABLE文を使用します。基本的な構文は以下のとおりです。alter table yourSecondTableName add constraint `yourConstraintName` foreign key(`yourSecon