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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

1700閲覧

DBのリレーション、外部キーについて[sql]

rgewgeg

総合スコア35

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/07/02 01:47

前提・実現したいこと

テーブルを複数作成します。
##fruit

id名前
1みかんオレンジ
2りんごあか
3ぶどうむらさき
##vegetable
id名前
:--:--:--:
1きゅうりみどり
2トマトあか
3だいこんしろ
##all_id
idfruit_idvegetable_id
:--:--:--:
1??
2??
3??

all_idのfruitとvegetableのそれぞれのidを基準に、fruit or vegetableテーブルのidを見てそれに沿ったカラムと内容をとってくる、といったことをしたいです。

fruitテーブルのid1の内容を見たいんだったら、fruitテーブルを直接見るのではなく、
一回all_idテーブルのfruit_idをみます。all_idテーブルのfruit_id1を見れば、fruitテーブルのid1を参照?できるといったやり方を実現したいです。

関係ないですがこの先何がしたいかもっと簡単に書くと、**"fruit_idの中身の数字を見ると1がある。このfruit_idの1はfruitテーブルのid1という意味なので、fruitテーブルのid1のあるカラム内容を取ってこよう。"**これをしたいです。

なのでまずはそれらを関連付けたいです。

heidisqlを使用していますが、いまいち調べてもやり方がわからず、リレーション・外部キーという単語が関わってそうですがうまく理解できませんでした。
教えていただけますか?

またそもそもそれは可能ですか?

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

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

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

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

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

sazi

2020/07/02 02:57

回答でのコメントのやり取りを見ていると、データベースの機能とマイグレーション等のフレームワークの機能の知識が断片的な理解になっていると思います。 データベースの理解を深める事から始めた方が体系的な理解になるとは思いますが、laravelあたりから取り組んだ方が直接やりたい事に近いと思われるので、取り組み易いのではないかと。 そうしないとコメントのやりとりが延々と続きそうです。
rgewgeg

2020/07/02 03:05

質問したら回答してくれてますが、それにより新たに分からないことが増えて、それについて聞いてってなってますね。 結果ごちゃごちゃしててわかりませんし、何が起こってるのかわからなくなってきてます。 悲しいです。
sazi

2020/07/02 03:44

現在の知識の量を超えた回答なので、しょうがないです。 もう少し調べて知識量が増えた状態でなら回答も理解できるでしょうし、そもそも質問しなくても済むかもしれませんしね。
guest

回答2

0

せっかくなので

この先何がしたいか
"fruit_idの中身の数字を見ると1がある。このfruit_idの1はfruitテーブルのid1という意味なので、fruitテーブルのid1のあるカラム内容を取ってこよう。"

についてもう少し詳細を知りたいです。

何を持って all_id テーブルのid:1を参照しますか?

リレーションとは関連、紐付き。
例えば
all_idテーブル

idfruit_idvegetable_id
111

であれば

all_id.id=1 に紐付くデータは、all_id.fruit_id=fruit.id=1(みかん)とall_id.vegetable_id=vegetable.id=1(きゅうり)だよ。
という情報になります。

何がしたいかによるDBテーブル設計のお話だと思うので、リレーションを行う必要があるのか?ということになってきます。
学習目的であれば構いませんが、もう少しわかりやすい例を使用したほうが良いような気がします。

また、多対多のリレーションはややこしさが増すので、1対多のリレーションから触れてみてはいかがでしょうか?

投稿2020/07/02 02:12

bracket_i

総合スコア193

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

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

bracket_i

2020/07/02 02:15

あ、めっちゃ話進んでた。 (こちらには無理にコメントいただかなくても大丈夫です。)
rgewgeg

2020/07/02 02:19

ちょっと一緒に読んでいただければと思います。
rgewgeg

2020/07/02 02:35

やり取り見ていただいて、わかりますか? 私が実現したいことはどうすればできるのか。 そのための構造はどう変更すればいいのか。
bracket_i

2020/07/02 02:46

maisumakunさんの回答でコメントしようかとも思いましたが、 話がそれて混乱のもとになるのでこちらで。 質問から:DBのリレーションについてはまだ理解されていない コメントから、やりたいこと:連動して削除 ということで、削除したいデータ=連動しているデータを作るところから リレーションへの理解を深められてはいかがでしょうか? その後の削除方法、DBトリガ使用するでも、CakePHPの機能を利用するでも。 手を動かさ(動くものを作ら)ないと、理解も深められそうになく、机上の論議で前に進まなそうなので
guest

0

ベストアンサー

fruit_idの中身の数字を見ると1がある。このfruit_idの1はfruitテーブルのid1という意味なので、fruitテーブルのid1のあるカラム内容を取ってこよう。

取ってくる動作は、自分で書くことになります。

なのでまずはそれらを関連付けたいです。

何もしなくても構いませんし、もちろんFOREIGN KEYを設定することも可能です。

投稿2020/07/02 01:54

maisumakun

総合スコア145183

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

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

maisumakun

2020/07/02 01:58

テーブルとテーブルの関係性は、基本的に「設計する人間」の中にだけあるもので、テーブルに直接設定するものではありません。
rgewgeg

2020/07/02 01:59

はい。自分で書くのは承知です。 もう一度書きますね。 関連付けることが目的ですし、リレーション・外部キーが必要な事も雰囲気はつかめてました。しかしそのやり方がわかりません。 何もしなくても構わないというのはどういう意味ですか?
rgewgeg

2020/07/02 02:01

入れ違いになってしまいましたね。 これを実現するのに、外部キーは関係ないんですか? all_idのfruit_idを見たら勝手にfruitテーブルのidを取ってくるんですか? それ自体を処理で書けということですか?なので、テーブルですることは何もないんですか? ということは外部キーは今回関係ないんですか?設定する意味がある場合はどんな時ですか?
maisumakun

2020/07/02 02:01

> 何もしなくても構わないというのはどういう意味ですか? 書いてのとおりです。テーブル設計、INSERTの際に特殊なことをせずとも、SELECTする段でJOINを行うだけで済みます。
maisumakun

2020/07/02 02:08 編集

> それ自体を処理で書けということですか?なので、テーブルですることは何もないんですか? そのとおりです。SELECTの際に`INNER JOIN fruit ON all_id.friut_id = fruit.id`のように指定します(これは外部キーがあってもなくても変わりません)。 > 設定する意味がある場合はどんな時ですか? 外部キーを設定すると、all_id.friut_idに、fruit.idとして入っている値しか入れられなくなる、という機能です。
rgewgeg

2020/07/02 02:09

ほお。 では私これまったく無駄なことしようとしてますか? プログラム書いててDBやsqlのとこに当たり、リレーションの勉強しようと思ってやってみようと思ったんですが。 単純にそれぞれのテーブルから取ってくる方が簡単ですよね。いやおかしいですね。こんなはずじゃなかったんですが。
rgewgeg

2020/07/02 02:10

fruit_idを削除すれば、fruitテーブルのid1のカラムも削除できるな。と思ってやろうと思ったんですが。 私のやりたいこと理解していただけますか。
maisumakun

2020/07/02 02:13

> fruit_idを削除すれば、fruitテーブルのid1のカラムも削除できるな。 逆はFOREIGN KEYにON DELETE CASCADEを仕掛ければ可能ですが、その向きでやるには標準の機能ではなく、トリガを仕掛けるなどの特殊な設定が必要となります。
maisumakun

2020/07/02 02:13

> いやおかしいですね。こんなはずじゃなかったんですが。 どのような形を想定していたのでしょうか?
rgewgeg

2020/07/02 02:18

>どのような形を想定していたのでしょうか? > fruit_idを削除すれば~ が元です。あっちこっちいってすいません。 ということは、やるべきはないということですか?そんなめんどくさいものだったんでしょうか。単純に、「fruit_id1を消せば、fruitテーブルのid1のカラムも消えるし、便利だなぁ。」と思ってたんですが。 idとidを紐付けるってよくするんだと思ってました。リレーションっていうのとはこれ話違うんですか? 私のやり方が複雑かつめんどいのであれば、他にいい方法がありますか?
maisumakun

2020/07/02 02:21

> やるべきはないということですか? はい、そのとおりです。 > 単純に、「fruit_id1を消せば、fruitテーブルのid1のカラムも消えるし、便利だなぁ。」と思ってたんですが。 そういう性質のものではありません。 > idとidを紐付けるってよくするんだと思ってました。リレーションっていうのとはこれ話違うんですか? いえ、同じことです。
maisumakun

2020/07/02 02:22

フレームワークなどにある「連動して削除」は、「フレームワーク側のコード」で実装されているものです。SQLレベルでは各テーブルを動かしています。
rgewgeg

2020/07/02 02:25

>フレームワークなどにある「連動して削除」は、「フレームワーク側のコード」で実装されているものです。 >SQLレベルでは各テーブルを動かしています。 ちょっとすいません一気にわからないことばかりで混乱します。 私がしたいことは、連動して削除のようですね。連動して削除というのは、何か専門用語がありますか?どう調べたら、「フレームワーク側のコード」が出てきそうですかね。これに関しても何度も調べたんですがわからず。 >SQLレベル~ これはどういう意味でしょうか?
rgewgeg

2020/07/02 02:26

処理の話になってくるんで、言語によりますか。 cakephpです。
maisumakun

2020/07/02 02:27

> これはどういう意味でしょうか? 書いてのとおりです。CakePHPが、テーブルごとに適切なSQL文を実行しています。
rgewgeg

2020/07/02 02:34

んー。やろうとしてることが、やりたいことと関係ないのであれば...どういう構造なら実現できるんですかね...。色々考えてやってたんですが全部違いましたか...。 単純にテーブルから読み込んで削除、よりか"連動して削除"をしてみたいんですが。 リレーションとか紐づけってそのためにあるものだと思ってました。
maisumakun

2020/07/02 02:37

> "連動して削除"をしてみたいんですが。 ふつうはデータベースを操作する言語の側で実装しますが、どうしてもデータベースだけでやりたいのであればトリガを仕掛けるなどをする必要があります。 > リレーションとか紐づけってそのためにあるものだと思ってました。 そもそも論として、参照するfruit_idを削除したらfriutのレコードが不要となる、という状況がよくわからないです。
rgewgeg

2020/07/02 02:43

>トリガ そのトリガを仕掛ければ、all側で削除すればfruit側でも消せるんですかね。 ちょっとめんどそうですね。 >そもそも データベースで、テーブルのカラム1を消すのにidを基準として、そのカラムを消すことがそんなに不思議ですか? これより前の話をするととんでもない長さになるのでさすがに端折ります。 とにかく、私がしようとしてることは普通ではなく無駄なことなんですね。 素直にテーブルから取ってきてそれ削除すればいいということでファイナルアンサーですかXC
maisumakun

2020/07/02 02:45

> データベースで、テーブルのカラム1を消すのにidを基準として、そのカラムを消すことがそんなに不思議ですか? friut側を消すことでall_idを消すことはデータベースレベルでも可能ですが、それではまずいのか、というのが疑問の内容です。
maisumakun

2020/07/02 02:46

ふつう、リレーションは多数貼ってあるものですので、参照する1箇所に過ぎないall_id側の操作で参照先のfriutを消す、ということにはならないです。
rgewgeg

2020/07/02 02:51

>friut側を消すことでall_idを消すことはデータベースレベルでも可能 all_idを作った意味は、「リレーションをやってみたかった」からです。 これがリレーションか。というのを見たかったんです。テーブルと別のテーブルが一緒に消えてる!って目で確かめたくて。 あとこれの逆が可能じゃない意味がわかりません。なぜですか。。。? >多数貼る というのはどういう意味ですか?貼る?
maisumakun

2020/07/02 02:55

> テーブルと別のテーブルが一緒に消えてる!って目で確かめたくて。 でしたら、FOREIGN KEYをON DELETE CASCADEでかけて、fruitの側のレコードをDELETEしてください。 > あとこれの逆が可能じゃない意味がわかりません。なぜですか。。。? 上に書いたとおりです。「リレーションを貼る」というのは「リレーションを設定する」というような意味です。
maisumakun

2020/07/02 02:57

fruit_idを入れているテーブルが、all_id以外にshoppingとかstockとかたくさんある、というのが多くのデータベースの構造です。 fruit自体を消せば他のものも当然変更しないといけなくなりますが、all_idの都合だけでfruitごと消す、ということは通常必要とされません。
rgewgeg

2020/07/02 03:03

>というのが多くのデータベースの構造です こういうテーブル(all_id)は存在しないし、するべきではないんですね。 ちょっともうごっちゃになってきました。 >FOREIGN KEYをON DELETE CASCADEでかけて、fruitの側のレコードをDELETEしてください。 これが私の求めていたものだと思うんですが...。 これを設定しただけでは、all_idのfruit_idを消しただけではfruitテーブルのカラムは削除されないんですか。 されそうなものですが...。
rgewgeg

2020/07/02 03:07

あぁ、これはこちら側も削除するってやつですね。勘違いでした。 でしたらallにしても意味ないですね。fruitにするべきでもないです。 なるほど、私のテーブルは間違いなんですね。 やりたいことは不可能なようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問