sql >> データベース >  >> RDS >> Sqlserver

子テーブルの外部キー制約により、親テーブルに存在しない値を挿入できます

    まず、実用的な 理由。外部キーは、インデックスを使用して維持およびチェックされます。インデックスを使用できるようにするには、インデックス内のすべての列の (求められる) 値を知る必要があります。 (a,b) に index/pk がある場合 (NULL,1) の外部キー値があります 、求めることはできません b を持つ行があるかどうかを判断するために、インデックス内に 値は 1 です。これにより、外部キーの維持が「高価」になります。

    しかし第二に、一貫性を考慮する必要があります。単一の列の場合、それはかなり議論の余地がありません.FK列に値がある場合、参照された列に一致する値が必要です。それ以外の場合、FK 列が NULL の場合 その場合、制約はチェックされません。

    しかし、これを複数の列に拡張するにはどうすればよいでしょうか。 とは 上のルール? シングルはありません 明らかな解釈ですが、代わりに複数の解釈があります。上記のルールは「if all 列が NULL でない場合、制約がチェックされます" または "if any 列が非 NULL の場合、制約がチェックされます"? これらのルールは、1 つの列のみが考慮されている場合と同じです。

    ルールが 2 番目のルールであると予想していましたが、実際には最初のルールでした。これは明示的に 文書化されています :



    1. 高価なクエリはデータベースサーバーをダウンさせます-軽減する方法を探しています

    2. 特定の日付に営業日数を追加する方法

    3. AndroidOSとpostgreSQL

    4. ibdata1からmysqlデータベースを回復します