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

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

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

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

phpMyAdmin

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

Q&A

解決済

3回答

2138閲覧

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

mitsumitsu

総合スコア2

MySQL

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

phpMyAdmin

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

0グッド

0クリップ

投稿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) )'.

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

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

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

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

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

Orlofsky

2022/10/28 21:22

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

2022/10/29 04:31

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

回答3

0

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

総合スコア16415

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

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

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 編集

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

0

すべて解決するわけではないですが、とりあえず以下
・外部キー名の重複(同一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

総合スコア80850

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

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

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でエラーが出る項目なのでそりゃそうなのですが
guest

0

自己解決

mysql

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

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

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

投稿2022/12/20 15:05

mitsumitsu

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問