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

Může být cizí klíč NULL a/nebo duplicitní?

Krátká odpověď:Ano, může být NULL nebo duplicitní.

Chci vysvětlit, proč může být nutné, aby byl cizí klíč null nebo mohl být jedinečný nebo nejedinečný. Nejprve si pamatujte, že cizí klíč jednoduše vyžaduje, aby hodnota v tomto poli nejprve existovala v jiné tabulce (nadřazené tabulce). To je vše, co FK podle definice je. Null z definice není hodnota. Null znamená, že ještě nevíme, jaká je hodnota.

Dovolte mi uvést příklad ze skutečného života. Předpokládejme, že máte databázi, která ukládá prodejní nabídky. Předpokládejme dále, že každá nabídka má přiděleného pouze jednoho prodejce a jednoho klienta. Vaše tabulka nabídky by tedy měla dva cizí klíče, jeden s ID klienta a jeden s ID obchodního zástupce. V době vytvoření záznamu však není vždy přiřazen obchodní zástupce (protože na něm zatím nikdo nemůže pracovat), takže ID klienta je vyplněno, ale ID obchodního zástupce může být nulové. Jinými slovy, obvykle potřebujete možnost mít nulový FK, když možná neznáte jeho hodnotu v době zadávání dat, ale znáte jiné hodnoty v tabulce, které je třeba zadat. Chcete-li obecně povolit nuly v FK, stačí povolit nuly na hřišti, které má FK. Hodnota null je oddělená od myšlenky, že jde o FK.

To, zda je jedinečná nebo nejedinečná, souvisí s tím, zda má tabulka vztah jedna-jedna nebo jedna-mnoho k nadřazené tabulce. Nyní, pokud máte vztah jedna jedna, je možné, že byste mohli mít data všechna v jedné tabulce, ale pokud je tabulka příliš široká nebo pokud jsou data na jiné téma (zaměstnanec - příklad pojištění @tbone uvedl například), pak chcete samostatné tabulky s FK. Pak byste chtěli vytvořit tento FK buď také jako PK (který zaručuje jedinečnost), nebo na něj umístit jedinečné omezení.

Většina FK je pro vztah jedna k mnoha a to je to, co od FK získáte, aniž byste přidali další omezení na hřišti. Takže máte například tabulku objednávek a tabulku podrobností objednávky. Pokud zákazník objedná deset položek najednou, má jednu objednávku a deset záznamů podrobností objednávky, které obsahují stejné ID objednávky jako FK.



  1. Horních n procent horních n %

  2. Odečtěte dny od data v PostgreSQL

  3. Příklad Java v databázi Oracle

  4. Jak naplánovat uloženou proceduru v MySQL