1. ホーム
  2. sql

[解決済み] 外部キーはNULLや重複にできますか?

2022-02-27 14:47:30

質問

2つのことを教えてください。

  1. 外部キーはNULLにできますか?
  2. 外部キーが重複している可能性はありますか?

私が知っている限りでは、公正です。 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個の注文詳細レコードを持つことになります。