回答編集履歴

1 追記

KiyoshiMotoki

KiyoshiMotoki score 4743

2015/12/02 13:29  投稿

`pk_group_artist_relations`カラムにインデックスが張られていないためです。
以下のリンクの「カラムのデータ型および属性」という項目に、以下のように記載があります。
[https://dev.mysql.com/doc/refman/5.6/ja/create-table.html](https://dev.mysql.com/doc/refman/5.6/ja/create-table.html)
> 注記
> テーブルごとに存在できる AUTO_INCREMENT カラムは 1 つだけです。このカラムはインデックス付きである必要があり、DEFAULT 値を割り当てることはできません。
そのため、`pk_group_artist_relations`カラムにインデックス(オートインクリメントカラムなので、ユニークインデックスが相応しいでしょう)を張ってやれば、
うまく行きます。
```sql
mysql> CREATE TABLE group_artist_relations
   -> (
   ->    group_id                   INT NOT NULL,
   ->    artist_id                  INT NOT NULL,
   ->    pk_group_artist_relations  INT NOT NULL,
   ->    CONSTRAINT PRIMARY KEY (group_id, artist_id)
   -> );
Query OK, 0 rows affected (0.02 sec)
mysql> ALTER TABLE group_artist_relations modify pk_group_artist_relations INT( 4 ) UNIQUE AUTO_INCREMENT;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE group_artist_relations\G
*************************** 1. row ***************************
      Table: group_artist_relations
Create Table: CREATE TABLE `group_artist_relations` (
 `group_id` int(11) NOT NULL,
 `artist_id` int(11) NOT NULL,
 `pk_group_artist_relations` int(4) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`group_id`,`artist_id`),
 UNIQUE KEY `pk_group_artist_relations` (`pk_group_artist_relations`)
) ENGINE=InnoDB DEFAULT CHARSET=cp932
1 row in set (0.00 sec)
```
```
ところで、`pk_group_artist_relations`カラムの用途は何でしょうか?
すでにプライマリキーが存在するので、オートインクリメントカラムは
「そもそも必要なの?」
という疑問を感じます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る