sql >> Database >  >> RDS >> Sqlserver

Foreign Key Constraint in onderliggende tabel maakt het mogelijk om waarden in te voegen die niet in de bovenliggende tabel voorkomen

Ten eerste hebben we de praktische redenen. Buitenlandse sleutels worden onderhouden en gecontroleerd met behulp van indexen. Om een ​​index bruikbaar te maken, moeten we de (gezochte) waarden van alle kolommen binnen de index kennen. Als we een index/pk hebben op (a,b) en we hebben een externe sleutelwaarde van (NULL,1) , we kunnen niet zoeken binnen de index om te bepalen of er een rij is met een b waarde van 1. Dit zou de externe sleutel "duur" maken om te onderhouden.

Maar ten tweede moeten we rekening houden met consistentie. Voor het geval met één kolom is het vrij onomstreden - als je een waarde in de FK-kolom hebt, dan moet er een overeenkomende waarde zijn in de kolom waarnaar wordt verwezen. Anders, als de FK-kolom NULL is dan is de beperking niet aangevinkt.

Maar hoe breiden we dit uit naar meerdere kolommen? Wat is bovenstaande regel? Er is geen enkele voor de hand liggende interpretatie, maar in plaats daarvan meerdere. Is de bovenstaande regel "als alles kolommen niet-NULL zijn, dan is de beperking aangevinkt" of "indien een kolommen niet-NULL zijn, dan is de beperking aangevinkt"? Deze regels zijn identiek wanneer er slechts één kolom wordt overwogen.

Je had verwacht dat de regel de tweede zou zijn, terwijl het in feite de eerste is. Dit is expliciet gedocumenteerd :



  1. Incrementele statistieken worden NIET gebruikt door de Query Optimizer

  2. Fout bij het gebruik van kopieeropdracht in Postgres (ERROR:ongeldige invoersyntaxis voor typedatum:)

  3. Ongeordende resultaten in SQL

  4. Select invoerveld vullen met waarde uit mysql