sql >> Databáze >  >> RDS >> Sqlserver

Omezení cizího klíče v podřízené tabulce umožňuje vložit hodnoty, které v nadřazené tabulce neexistují

Za prvé, máme praktické důvody. Cizí klíče jsou udržovány a kontrolovány pomocí indexů. Aby byl index použitelný, potřebujeme znát (hledané) hodnoty všech sloupců v rámci indexu. Pokud máme index/pk na (a,b) a máme hodnotu cizího klíče (NULL,1) , nemůžeme hledat v indexu, abyste zjistili, zda existuje nějaký řádek s b hodnota 1. To by znamenalo, že údržba cizího klíče by byla "drahá".

Ale zadruhé musíme zvážit konzistenci. V případě jednoho sloupce je to docela nekontroverzní - pokud máte hodnotu ve sloupci FK, pak v odkazovaném sloupci musí být odpovídající hodnota. Jinak, pokud je sloupec FK NULL pak omezení není zaškrtnuto.

Ale jak to rozšíříme na více sloupců? Co je pravidlo výše? Neexistuje žádný jediný zřejmý výklad, ale místo toho několik. Je výše uvedené pravidlo „pokud vše sloupce nemají hodnotu NULL, pak je omezení zkontrolováno" nebo "pokud nějaké sloupce nemají hodnotu NULL, pak je omezení zkontrolováno"? Tato pravidla jsou identická, pokud je zvažován pouze jeden sloupec.

Očekávali jste, že pravidlo bude druhé, i když ve skutečnosti je první. Toto je výslovně zdokumentováno :



  1. Jak dále filtrovat záznam GROUP BY v mysql?

  2. Vymažte nadpis v zařazování Oracle

  3. Vložení proměnné do SQL dotazu z Javy

  4. Žádné výsledky SQL Query po úspěšném importu CSV do mysql pomocí LOAD DATA LOCAL INFILE