質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

14182閲覧

複合主キーに後からAUTO_INCREMENTをつけたい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2015/12/01 15:51

編集2015/12/01 15:51

以下のようなテーブルがあります

CREATE TABLE body.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) );

** pk_group_artist_relations AUTO_INCREMENT**をつけたいと思い以下のようなSQLを書いたのですが

ALTER TABLE group_artist_relations modify pk_group_artist_relations INT( 4 ) AUTO_INCREMENT;

incorrect table definition; there can be only one auto column and it must be defined as a key
と言われてしまいました
何が違うのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

pk_group_artist_relationsカラムにインデックスが張られていないためです。

以下のリンクの「カラムのデータ型および属性」という項目に、以下のように記載があります。
https://dev.mysql.com/doc/refman/5.6/ja/create-table.html

注記
テーブルごとに存在できる AUTO_INCREMENT カラムは 1 つだけです。このカラムはインデックス付きである必要があり、DEFAULT 値を割り当てることはできません。

そのため、pk_group_artist_relationsカラムにインデックス(オートインクリメントカラムなので、ユニークインデックスが相応しいでしょう)を張ってやれば、
うまく行きます。

sql

1mysql> CREATE TABLE group_artist_relations 2 -> ( 3 -> group_id INT NOT NULL, 4 -> artist_id INT NOT NULL, 5 -> pk_group_artist_relations INT NOT NULL, 6 -> CONSTRAINT PRIMARY KEY (group_id, artist_id) 7 -> ); 8Query OK, 0 rows affected (0.02 sec) 9 10mysql> ALTER TABLE group_artist_relations modify pk_group_artist_relations INT( 4 ) UNIQUE AUTO_INCREMENT; 11Query OK, 0 rows affected (0.02 sec) 12Records: 0 Duplicates: 0 Warnings: 0 13 14mysql> SHOW CREATE TABLE group_artist_relations\G 15*************************** 1. row *************************** 16 Table: group_artist_relations 17Create Table: CREATE TABLE `group_artist_relations` ( 18 `group_id` int(11) NOT NULL, 19 `artist_id` int(11) NOT NULL, 20 `pk_group_artist_relations` int(4) NOT NULL AUTO_INCREMENT, 21 PRIMARY KEY (`group_id`,`artist_id`), 22 UNIQUE KEY `pk_group_artist_relations` (`pk_group_artist_relations`) 23) ENGINE=InnoDB DEFAULT CHARSET=cp932 241 row in set (0.00 sec)

ところで、pk_group_artist_relationsカラムの用途は何でしょうか?
すでにプライマリキーが存在するので、オートインクリメントカラムは
「そもそも必要なの?」
という疑問を感じます。

投稿2015/12/02 03:46

編集2015/12/02 04:29
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/02 14:33

UNIQUEをつけたらできました
guest

0

あとから追加する以前に、複合キーの第二キー以降にAUTO_INCREMENT属性はつけられないようです。

たとえばつぎのようにすると、複合キーのひとつにAUTO_INCREMENT属性を付与させること自体は可能です。

sql

1CREATE TABLE body.group_artist_relations 2( 3 group_id INT NOT NULL, 4 artist_id INT NOT NULL AUTO_INCREMENT, 5 pk_group_artist_relations INT NOT NULL, 6 CONSTRAINT PRIMARY KEY (artist_id, group_id) -- (group_id, artist_id) ではなく 7);

http://www.dbonline.jp/mysql/table/index7.html
しかしながら、テーブル1つに対して連番が付される仕様がAUTO_INCREMENT属性ですので(上記ページご参照)、仮に (group_id, artist_id) の順で主キーを定義できたとしても、group_idの値と関係なくartist_idは+1ずつされていくでしょう。

[group_id, artist_id] 100, 1 120, 2 100, 3 100, 4 115, 5

group_id の値各々において連番を付与したいのでしたら

[group_id, artist_id] 100, 1 120, 1 100, 2 100, 3 115, 1

解決方法として、INSERTトリガーで定義する方法があります。
http://www.dbonline.jp/mysql/trigger/index1.html

sql

1CREATE TRIGGER trigger1 BEFORE INSERT ON body.group_artist_relations 2 FOR EACH ROW BEGIN 3 DECLARE newid INT; 4 SELECT IFNULL(MAX(artist_id) + 1, 初期値) INTO @newid FROM group_artist_relations WHERE group_id = new.group_id; 5 SET new.artist_id = @newid; 6 END

関連行がDELETEされたときにつじつまが合わなくなる可能性がありますので、関連テーブルには参照制約(FOREIGN KEY .. REFERENCES...)を指定しておくことをおすすめします。

投稿2015/12/02 03:23

編集2015/12/02 03:45
hsk

総合スコア728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これでは?↓

MySQL フィールドにAUTO_INCREMENT属性を追加する
http://blog.doli.jp/blog/2012/post509/

投稿2015/12/01 16:08

yuki84web

総合スコア1857

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問