🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

Q&A

解決済

1回答

2659閲覧

MySQLで外部キー制約が追加出来ません。

Dragon-attack

総合スコア5

MySQL

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

1グッド

0クリップ

投稿2019/09/19 01:21

前提・実現したいこと

図のようなDBを構築したいのですが、外部キー制約追加が出来ません。

イメージ説明

DBのソースコード

CREATE TABLE users (
user_id int(8) NOT NULL,
user_name varchar(30) NOT NULL,
user_email varchar(255) NOT NULL,
user_password varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE products (
product_id int(8) NOT NULL,
product_name varchar(255) NOT NULL,
product_description text NOT NULL,
product_cat int(8) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE reviews (
review_id int(8) NOT NULL,
review_comment text NOT NULL,
review_date datetime NOT NULL,
review_product_id int(8) NOT NULL,
review_user_id int(8) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

試した事とエラーメッセージ

SQL発行
alter table reviews add foreign key (review_product_id) references products(product_id);
alter table reviews add foreign key (review_user_id) users(user_id);

すると、下図のようにエラーメッセージが発生。
My SQLのエラーメッセージ:#1215
イメージ説明

2.Relation viewからの外部制約キー追加'
右端、外部キー制約欄のカラム欄がドロップリストに✔︎マークしかない状態でした。
イメージ説明
イメージ説明

その後、色々ググって調べて見てるものの、解決の目処が経たず。
調査の仕方とかも見当がつかず。
畏れ入りますが解決の糸口を見つけたくご教示頂ければと思います。

バージョン

MySQL ver 5.0.12

yodel👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

usersテーブルのuser_idカラムおよびproductsテーブルのproduct_idカラムに
unique属性(もしくは主キー)が抜けています
外部キー制約なのですからn対1の関係でなくてはなりません

またusersへの外部キー制約付加のsqlが間違っています

SQL

1CREATE TABLE users ( 2user_id int(8) NOT NULL unique, 3user_name varchar(30) NOT NULL, 4user_email varchar(255) NOT NULL, 5user_password varchar(255) NOT NULL 6) ENGINE=InnoDB DEFAULT CHARSET=utf8; 7 8CREATE TABLE products ( 9product_id int(8) NOT NULL unique , 10product_name varchar(255) NOT NULL, 11product_description text NOT NULL, 12product_cat int(8) NOT NULL 13) ENGINE=InnoDB DEFAULT CHARSET=utf8; 14 15CREATE TABLE reviews ( 16review_id int(8) NOT NULL, 17review_comment text NOT NULL, 18review_date datetime NOT NULL, 19review_product_id int(8) NOT NULL, 20review_user_id int(8) NOT NULL 21) ENGINE=InnoDB DEFAULT CHARSET=utf8; 22 23alter table reviews add foreign key (review_product_id) references products(product_id); 24alter table reviews add foreign key (review_user_id) references users(user_id);

投稿2019/09/19 01:31

yambejp

総合スコア116661

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

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

yambejp

2019/09/19 01:35

流石にmysql5.0は古すぎないでしょうかねぇ・・・
Dragon-attack

2019/09/19 01:39

yambejp様 ご回答誠に有難うございます。添付のSQLで流してみたらいけました。 また、「unique属性」と「主キー」という概念・意義・関連性が全く分からない状態なので、 自分で調べてみます。(すみません、勉強開始2ヶ月目の初学者です。。) いずれにしろ、途方に暮れていたので助かりました!重ねてお礼申し上げます。
Dragon-attack

2019/09/19 01:45

え?そうなんですか?笑 すみません疎くて。PHPの方は7.2.1です。 これを機にmysqlもアップデートしようと思います。
yambejp

2019/09/19 01:53

メジャーバージョンは8.0にシフトしていますが、 とりあえず5.7までは上げておいたほうがよいかもしれません
Dragon-attack

2019/09/19 04:56

8.0まで行ってるんですね。。。 言われて気づいたのですが、現在MAMPを使ってまして、MySQLとApatcheを各自インストールしてはいない状況です。MAMP上でもアップデート出来るかどうか、自分でも調べてみます。有り難う御座いました^^!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問