[解決済み] なぜ、テーブル間の「リレーションシップ」が必要なのか?
2022-03-11 23:08:51
質問
以下の2つのテーブルがあるとします。
CREATE TABLE tblProduct
(`Product_ID` int, `Product_Name` varchar(7));
そして
CREATE TABLE tblProductExtended
(`Product_ID` int, `Product_Size` int, `Product_Quantity` int);
この値で
INSERT INTO tblProduct
(`Product_ID`, `Product_Name`)
VALUES
(1, 'Shoes1'),
(2, 'Shoes2');
そして
INSERT INTO tblProductExtended
(`Product_ID`, `Product_size`, `Product_Quantity`)
VALUES
(1, 36, 20),
(1, 37, 20),
(1, 38, 30),
(2, 36, 50),
(2, 37, 60),
(2, 37, 75);
今、明らかに、tblProductExpandedのProduct_IDは、tblProductのProduct_IDのFKであるべきです。しかし、私はまだクエリを実行することができます。
SELECT tblProduct.Product_ID, Product_Name, Product_Size, Product_Quantity
FROM tblProduct
INNER JOIN tblProductExtended ON tblProduct.Product_id = tblProductExtended.Product_id
どちらが返すか。
Product_ID Product_Name Product_Size Product_Quantity
1 Shoes1 36 20
1 Shoes1 37 20
1 Shoes1 38 30
2 Shoes2 36 50
2 Shoes2 37 60
2 Shoes2 37 75
リレーションシップに関係なく同じ情報をクエリできるのであれば、なぜリレーションシップが必要なのか、どなたか説明していただけませんか?設定に時間がかかることを除けば、実際にどのような用途があるのでしょうか。
どのように解決するのですか?
主な理由は、データの整合性のためだと思います。2つのテーブルの間にリレーションシップがある場合
invoice and invoice_item
. 請求書と関係のない項目を追加することはできません。これは、あなたが望むものです
その名も 参照整合性 . 外部キーがないと、データを簡単に削除したり破損させたりできるので、データベースがかなり混乱する可能性があります。
例:請求書を削除しても、それに対応する請求書項目が削除されない可能性があります。これは悪いことだと考えられています。
これによって、何かが見えてくると思うのです。
関連
-
[解決済み】識別関係と非識別関係の違いとは?
-
[解決済み】使用されるSELECT文は列の数が異なる(REDUX!)
-
[解決済み] ORA-01790: 式は、対応する式と同じデータ型でなければならないエラーが発生するケース
-
[解決済み] ORA-01779: キーが保存されていないテーブルにマップされる列を変更できません。
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] データベースのカラムに区切りリストを格納することは、本当に悪いことなのか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】CREATE VIEW は、バッチ内の唯一のステートメントでなければなりません。
-
[解決済み] varchar 値 'simple, ' をデータ型 int に変換する際に変換に失敗しました。
-
[解決済み】Teradata - 計算中に数値のオーバーフローが発生しました。
-
[解決済み】SQL ServerでIdentityカラムを更新する方法は?
-
[解決済み] 2つの列を分割するには?
-
[解決済み] エラー: 名前解析スクリプトで正しい関数に渡された長さのパラメーターが無効です。
-
[解決済み] "このSqlTransactionは完了しました。もう使用できません。"...設定エラー?
-
[解決済み] 集計を行わずに行から列へピボット移動する
-
[解決済み] 検索エラー ORA-00932: 不整合なデータ型: 期待された DATE は NUMBER になりました。
-
[解決済み] CLOBとNCLOBの違いは何ですか?