web-dev-qa-db-ja.com

mySQLの外部キーとNULL

値テーブル(value)の列をknownValuesテーブルへの外部キーとして参照し、次の例のように、必要に応じてNULLにすることはできますか?

表:値

 product     type     value     freevalue
 0           1        NULL      100
 1           2        NULL      25
 3           3        1         NULL

表:タイプ

 id    name     prefix
 0     length   cm
 1     weight   kg
 2     fruit    NULL

表:knownValues

id    Type     name
0     2        banana 

注:テーブルvaluesknownValuesのタイプは、もちろんtypesテーブルで参照されます。

19
Industrial

外部キーのNULLは完全に受け入れられます。外部キーのNULLを処理するのは難しいですが、そのような列をNOT NULLに変更して、参照テーブルにダミー( "N/A"、 "Unknown"、 "No Value"など)レコードを挿入することを意味するわけではありません。

外部キーでNULLを使用するには、多くの場合、INNERJOINではなくLEFT/RIGHTJOINを使用する必要があります。

23
Salman A

外部キー列をNULL可能にすることはできますが、一般的には、NULL可能外部キーなしでテーブルを設計する方がよいと思います。ヌルは常に特定のあいまいさと誤った結果につながりますが、問題の列が何らかの制約を受けると予想される場合、それは二重に問題になります。

6
nvogel

これは、1対0対多の関係です。私はこれをSQLServerで何度も使用しました。 MySQLでもこれを行うことができると思います。

データ集約に関連する問題があるため、データベースでNULLを回避することを好みます。そのため、設計によっては、ルックアップテーブルにUNKNOWN行を配置します。

4
Raj More

もちろん、外部キーにNULL値がある可能性はありますが、そのために心配する必要はありません。キー制約を管理するためのデータベースエンジンとしてInnoDBを使用していただければ幸いです。この場合、左結合または右結合を使用してDBから行を取得することをお勧めします。重複を避けるために、GroupByを使用できます。内部結合は使用しないでください。

1
Prabhu M

はい、外部キーが制約された列にNULLが含まれる可能性は十分にあります。試してみました。 InnoDBストレージエンジンを使用していない場合は、外部キーの制約は無視されることに注意してください。

1
Brian Hooper