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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

解決済

複合主キーを外部キーとした複合主キーのテーブルを作ろうとすると外部キー制約エラーが発生する

mitsumitsu
mitsumitsu

総合スコア2

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

3回答

0グッド

0クリップ

342閲覧

投稿2022/10/28 11:28

編集2022/10/29 05:18

前提

初質問なので不足情報あればぜひとも教えてください。

phpmyadminでmysqlを使用してテーブルを作成しようとしていますが、外部キー制約にエラーが出ます。

実現したいこと

  • 複合主キーを外部キーとした複合主キーのテーブルを作る

発生している問題・エラーメッセージ

#1215 - Cannot add foreign key constraint

該当のソースコード

mysql

1CREATE TABLE customers( 2 customers_mail VARCHAR(191) PRIMARY KEY, 3 customers_pass VARCHAR(191) NOT NULL, 4 customers_nick VARCHAR(191) NOT NULL, 5 customers_ln VARCHAR(191) NOT NULL, 6 customers_fn VARCHAR(191) NOT NULL, 7 customers_postcode CHAR(7) NOT NULL, 8 customers_pref VARCHAR(191) NOT NULL, 9 customers_address VARCHAR(191) NOT NULL, 10 customers_subaddress VARCHAR(191) 11); 12CREATE TABLE makers( 13 makers_id INT PRIMARY KEY, 14 makers_name VARCHAR(191) NOT NULL 15); 16CREATE TABLE buys( 17 buys_id INT PRIMARY KEY, 18 buys_date DATE NOT NULL, 19 customers_mail VARCHAR(191) NOT NULL, 20 buys_payment INT NOT NULL, 21 FOREIGN KEY fkey1 (customers_mail) REFERENCES customers(customers_mail) 22); 23CREATE TABLE items( 24 items_id INT PRIMARY KEY, 25 makers_id INT NOT NULL, 26 items_name VARCHAR(191) NOT NULL, 27 items_description VARCHAR(191) NOT NULL, 28 items_price INT NOT NULL, 29 items_url VARCHAR(191) NOT NULL, 30 items_genre VARCHAR(191) NOT NULL, 31 items_material VARCHAR(191) NOT NULL, 32 items_color VARCHAR(191) NOT NULL, 33 FOREIGN KEY fkey2 (makers_id) REFERENCES makers(makers_id) 34); 35CREATE TABLE itemsinfo( 36 items_id INT, 37 itemsinfo_size VARCHAR(191), 38 itemsinfo_stock INT NOT NULL, 39 FOREIGN KEY fkey3 (items_id) REFERENCES items(items_id), 40 PRIMARY KEY(items_id, itemsinfo_size) 41); 42CREATE TABLE details( 43 buys_id INT, 44 items_id INT, 45 itemsinfo_size VARCHAR(191), 46 details_vol INT NOT NULL, 47 FOREIGN KEY fkey4 (buys_id) REFERENCES buys(buys_id), 48 FOREIGN KEY fkey5 (items_id) REFERENCES itemsinfo(items_id), 49 FOREIGN KEY fkey6 (itemsinfo_size) REFERENCES itemsinfo(itemsinfo_size), 50 PRIMARY KEY(buys_id, items_id, itemsinfo_size) 51);

試したこと

参照元が主キーである(=一意制約)ことを確認
参照元と参照先の型が同じであることを確認

補足情報(FW/ツールのバージョンなど)

lolipopのphpmyadminです。

xamppのphpmyadminで試した結果、次のエラーとログが出力されました。

#1005 - `webdb`.`details` テーブルが作れません.(errno: 150 "Foreign key constraint is incorrectly formed")
------------------------ LATEST FOREIGN KEY ERROR ------------------------ 2022-10-29 14:11:39 0x3600 Error in foreign key constraint of table `webdb`.`details`: FOREIGN KEY fkey6 (itemsinfo_size) REFERENCES itemsinfo(itemsinfo_size), PRIMARY KEY(buys_id, items_id, itemsinfo_size) ): Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint. Note that the internal storage type of ENUM and SET changed in tables created with >= InnoDB-4.1.12, and such columns in old tables cannot be referenced by such columns in new tables. Please refer to https://mariadb.com/kb/en/library/foreign-keys/ for correct foreign key definition. Create table `webdb`.`details` with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY fkey6 (itemsinfo_size) REFERENCES itemsinfo(itemsinfo_size), PRIMARY KEY(buys_id, items_id, itemsinfo_size) )'.

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

Orlofsky

2022/10/28 21:22

質問は修正できます。 >外部キー制約にエラーが出ます。 質問のCREATE TABLE文を実行した時のエラーメッセージを一切編集しないでそのまま追加しては?
mitsumitsu

2022/10/29 04:31

エラーメッセージは#1215 - Cannot add foreign key constraintと表示されるのみです...

回答3

1

SQL

1CREATE TABLE itemsinfo( 2... 3 PRIMARY KEY(items_id, itemsinfo_size) 4 5と、PRIMARY KEY2つの列が指定してあるのに、 6... 7CREATE TABLE details( 8 FOREIGN KEY fkey6 (itemsinfo_size) REFERENCES itemsinfo(itemsinfo_size), 9外部キーが1つの列しか設定していないからエラーになっています。

制約名は分かり易いネーミングに。

なお、DWHでは遅くなるから外部キーは設定しません。外部キーがなくても整合性が維持できる能力のある人材を使います。

投稿2022/10/29 09:59

Orlofsky

総合スコア16248

m.ts10806👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

mitsumitsu

2022/10/29 14:25

すみません、もう少し詳しく教えていただけますか >外部キーが1つの列しか設定していないからエラーになっています。 に関してですが、外部キーは主キー同様 FOREIGN KEY fkey5 (items_id) REFERENCES itemsinfo(items_id), FOREIGN KEY fkey6 (itemsinfo_size) REFERENCES itemsinfo(itemsinfo_size), と二つ設定している(つもり)です。 こういうことではないということでしょうか。 見当違いかもしれませんが、上記の回答をうけ次のように修正して再度実行してみましたところ、エラーにはなりませんでしたがそもそもitems_idとitemsinfo_sizeの参照がされませんでした(無視された?) FOREIGN KEY fkey5 (items_id, itemsinfo_size) REFERENCES itemsinfo(items_id, itemsinfo_size),
Orlofsky

2022/10/29 19:50

答えは回答に書きました。ちゃんと読んでください。 FOREIGN KEY fkey5 (items_id, itemsinfo_size) REFERENCES itemsinfo(items_id, itemsinfo_size), って試しましたか? シリコンバレーで作られたOracle Databaseの銀行用のパッケージで闇雲に外部キーを設定してあったシステムの日本の環境に移行する案件をやったことがあります。パフォーマンスが悪くてかなりの外部キーを外すように提案しました。
mitsumitsu

2022/10/30 03:26

ええ、2つ前のコメントであなたが先程されたコメント通りの記述を行い実行しましたが、先述したようにエラーは無くなりましたが外部キー制約の効果がありませんでした。
Orlofsky

2022/10/30 04:32

質問は修正できます。 実行したSQLとそこで表示されるエラーメッセージをそのままで提示しては?
mitsumitsu

2022/10/30 05:19

もしかして非日本語話者の方でしょうか? 前述した通り、実行したsqlはあなたが提示した通りのものですし、エラーメッセージは出ませんでした。 しかし当該項目に外部キー制約が付与されませんでした。
Orlofsky

2022/10/30 11:43 編集

あなたの日本語理解力がないだけです。 面倒だからこれ以上はコメントしません。

1

すべて解決するわけではないですが、とりあえず以下
・外部キー名の重複(同一DB内で一意である必要がある)
マジックナンバーじゃなくfk_テーブル名_カラム名_・・・・みたいな命名の方が良いと思います

FOREIGN KEY fkey2 (items_id) REFERENCES itemsinfo(items_id),
FOREIGN KEY fkey3 (itemsinfo_size) REFERENCES itemsinfo(itemsinfo_size),

どちらもPKではないような。

投稿2022/10/29 02:15

編集2022/10/29 02:28
m.ts10806

総合スコア79952

spoofy_dragon👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

m.ts10806

2022/10/29 02:16

phpMyAdminならテーブルなりカラムなりGUIで設定できる機能があるので、 そちらを使った方が確実だと思います。
mitsumitsu

2022/10/29 04:37

>どちらもPKではないような。 どちらの参照元にはprimary keyを付与していて、GUI上でも鍵マークが灰色になっているのですがそれは何か間違っているのでしょうか
m.ts10806

2022/10/29 04:40

失礼 カラム 型 PRIMARY KEY と書いていたり PRIMARY KEY() とまとめていたりで統一されてないことで混乱していました。 テーブル作る順序とかも問題ないですか?
mitsumitsu

2022/10/29 04:55

統一性に関してはすみません... テーブルの順序は問題ないはずです、参照される順に記述しているので ちなみに、GUI上でdetailsのitemsinfo_sizeに外部キー制約付与しようとすると、選択肢にitemsinfoのitemsinfo_sizeが表示されないんですよね sqlでエラーが出る項目なのでそりゃそうなのですが

0

自己解決

mysql

1FOREIGN KEY fkey5 (items_id, itemsinfo_size) REFERENCES itemsinfo(items_id, itemsinfo_size),

としました。どうもGUI上ではリレーションが設定されていないような表示がされるのですが、実際にinsert等を行ってみるとしっかりと制約がかかっていました。

ご協力ありがとうございました。

投稿2022/12/20 15:05

mitsumitsu

総合スコア2

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。