[解決済み] 外部キーはNULLや重複にできますか?
質問
2つのことを教えてください。
- 外部キーはNULLにできますか?
- 外部キーが重複している可能性はありますか?
私が知っている限りでは、公正です。
NULL
しかし、私のあるアプリケーションでは、外部キーに
NULL
は、Oracle と SQL Server の両方で使用できますが、その理由はわかりません。
どうしたらいいですか?
簡単な答えです。はい、NULLまたは重複している可能性があります。
なぜ外部キーがNULLである必要があるのか、一意である必要があるのか、一意でない必要があるのかを説明したいと思います。まず、外部キーは単にそのフィールドの値が別のテーブル(親テーブル)に最初に存在しなければならないことを思い出してください。これがFKの定義です。NULLは定義上、値ではありません。Nullは、その値が何であるかがまだわかっていないことを意味します。
実例を挙げましょう。営業企画書を保存するデータベースがあるとします。さらに、各案件には、1人の営業担当者と1人の顧客しか割り当てられていないとします。 そこで、提案書テーブルには、顧客 ID と営業担当者 ID の 2 つの外部キーを持つことになります。 しかし、レコードが作成された時点では、営業担当者が常に割り当てられているわけではないので(まだ誰も自由に作業できないため)、顧客IDは記入されていますが、営業担当者IDはnullである可能性があります。 言い換えれば、通常は、データが入力された時点ではその値がわからないが、入力が必要なテーブルの他の値はわかっている場合に、NULLのFKを持つ機能が必要です。FKでNULLを許可するには、一般に、FKを持つフィールドでNULLを許可すればよい。null値は、FKであるという考えとは別のものです。
一意か一意でないかは、そのテーブルが親テーブルと一対一の関係か、一対多の関係かに関係します。 一対一の関係であれば、1つのテーブルにデータをまとめることも可能ですが、テーブルが広くなりすぎたり、データが異なるトピック(例えば@tboneが挙げた社員-保険の例)の場合は、FKで別々のテーブルにしたいところです。そして、このFKをPK(一意性を保証する)にするか、一意性制約をかけるかのどちらかにすることになります。
ほとんどのFKは1対多の関係であり、フィールドにさらなる制約を加えることなく、FKから得られるものはこれだけです。例えば、注文テーブルと注文詳細テーブルがあるとします。顧客が一度に10個の商品を注文した場合、顧客は1つの注文と、FKと同じorderIDを含む10個の注文詳細レコードを持つことになります。
関連
-
[解決済み] 集計を行わずに行から列へピボット移動する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] 重複した行を削除するにはどうすればよいですか?
-
[解決済み] T-SQLを使用して外部キー制約を一時的に無効にするにはどうすればよいですか?
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?
-
[解決済み] MySQL エラー 1215。外部キー制約を追加できません
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】外部キー制約。ON UPDATEとON DELETEを使用する場合
-
[解決済み] [Solved] Oracle SQL Developerで、指定したテーブルを参照しているテーブルを見つけるにはどうしたらいいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テーブルのFROM句の項目がない [終了しました] 。
-
[解決済み】集約関数のないTSQLピボット
-
[解決済み】SQLクエリ「00904. 00000 - "%s: 無効な識別子"
-
[解決済み】Athena: スケールファクターでリソースを使い果たすクエリ
-
[解決済み] ORA-12801: 並列クエリサーバー P004 および ORA-01555 でシグナルされたエラー: スナップショットが古すぎる。
-
[解決済み] SQL Server - INNER JOIN WITH DISTINCT
-
[解決済み] SQLです。最初の出現箇所のみを返す
-
[解決済み] ORA-00997: LONG データタイプの不正使用に対する回避策
-
[解決済み] マルチパート識別子をバインドできなかった
-
[解決済み】MySQL、NULLと空の文字列のどちらを挿入するのが良いですか?