まず、実用的な 理由。外部キーは、インデックスを使用して維持およびチェックされます。インデックスを使用できるようにするには、インデックス内のすべての列の (求められる) 値を知る必要があります。 (a,b)
に index/pk がある場合 (NULL,1)
の外部キー値があります 、求めることはできません b
を持つ行があるかどうかを判断するために、インデックス内に 値は 1 です。これにより、外部キーの維持が「高価」になります。
しかし第二に、一貫性を考慮する必要があります。単一の列の場合、それはかなり議論の余地がありません.FK列に値がある場合、参照された列に一致する値が必要です。それ以外の場合、FK 列が NULL
の場合 その場合、制約はチェックされません。
しかし、これを複数の列に拡張するにはどうすればよいでしょうか。 とは 上のルール? シングルはありません 明らかな解釈ですが、代わりに複数の解釈があります。上記のルールは「if all 列が NULL でない場合、制約がチェックされます" または "if any 列が非 NULL の場合、制約がチェックされます"? これらのルールは、1 つの列のみが考慮されている場合と同じです。
ルールが 2 番目のルールであると予想していましたが、実際には最初のルールでした。これは明示的に 文書化されています :