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

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

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

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

Q&A

解決済

1回答

844閲覧

mysql の外部キー制約についてのエラー

tuioku

総合スコア42

MySQL

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

0グッド

0クリップ

投稿2022/12/19 04:49

二つの簡単なサンプル sql ファイルを作成しました。
しかし、child テーブルを import しようとすると「child テーブルのインポートエラー」のメッセージが出てきて入りません。
parent テーブルの index の順番が Attribute カラムが一番上だとうまく入ります。

外部キー参照をする場合、参照先のテーブル構造は複合キーを扱えないのでしょうか?

■child テーブルのインポートエラー

[ERROR in query 1] Failed to add the foreign key constraint. Missing index for constraint 'Attribute_fk' in the referenced table 'parent'

■parent.sql

CREATE TABLE `parent` ( `Parent` int(10) NOT NULL, `Attribute` varchar(200) NOT NULL, PRIMARY KEY ( `Parent`, `Attribute` ) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; -- CREATE TABLE `parent` -- ( -- `Attribute` varchar(200) NOT NULL, -- `Parent` int(10) NOT NULL, -- PRIMARY KEY ( -- `Attribute`, -- `Parent` -- ) -- ) ENGINE = InnoDB -- DEFAULT CHARSET = utf8mb4; → Attribute カラムが一番上だと child テーブルがインポートできます。

■child.sql

CREATE TABLE `child` ( `Name` varchar(200) NOT NULL, `Attribute` varchar(200) NOT NULL, `Parent` int(10) NOT NULL, PRIMARY KEY (`Name`), CONSTRAINT `Attribute_fk` FOREIGN KEY (`Attribute`) REFERENCES `parent` (`Attribute`) -- CONSTRAINT `Parent_fk` FOREIGN KEY (`Parent`) REFERENCES `parent` (`Parent`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

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

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

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

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

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

guest

回答1

0

ベストアンサー

普通に考えればparentの主キーが複合主キーを使用しているのですから、外部キー制約も同様の設定をスべきです

SQL

1CREATE TABLE `parent`( 2 `Parent` int(10) NOT NULL, 3 `Attribute` varchar(200) NOT NULL, 4 PRIMARY KEY ( 5 `Parent`, 6 `Attribute` 7 ) 8 ) ENGINE = InnoDB; 9 10CREATE TABLE `child`( 11 `Name` varchar(200) NOT NULL, 12 `Attribute` varchar(200) NOT NULL, 13 `Parent` int(10) NOT NULL, 14 PRIMARY KEY (`Name`), 15 FOREIGN KEY (`Parent`,`Attribute`) REFERENCES `parent` (`Parent`,`Attribute`) 16 ) ENGINE = InnoDB;

parentの主キーの設定自体順番に依存しませんが、インデックスの参照のせいかchildはparentで指定した順にしていしないとエラーになるようです。

そもそもが、複合主キーを指定したテーブルに対して外部キー制約が本当に必要か検討の余地があると思います。
(ようはマスターデータを作るような機能ですから、複合キーでのマスター指定は煩雑になりますので)

投稿2022/12/19 05:32

yambejp

総合スコア114839

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問