sql >> Database teknologi >  >> RDS >> Sqlserver

Kan en fremmednøgle være NULL og/eller duplikeret?

Kort svar:Ja, det kan være NULL eller dublet.

Jeg vil gerne forklare, hvorfor en fremmednøgle måske skal være nul eller måske skal være unik eller ikke unik. Husk først at en fremmednøgle kræver blot, at værdien i det felt skal eksistere først i en anden tabel (den overordnede tabel). Det er alt, hvad en FK per definition er. Null er per definition ikke en værdi. Null betyder, at vi endnu ikke ved, hvad værdien er.

Lad mig give dig et eksempel fra det virkelige liv. Antag, at du har en database, der gemmer salgsforslag. Antag endvidere, at hvert forslag kun har én sælger tilknyttet og én kunde. Så din forslagstabel ville have to fremmednøgler, en med klient-id og en med sælger-id. Men på det tidspunkt, hvor posten oprettes, er der ikke altid tildelt en sælger (fordi ingen er fri til at arbejde på den endnu), så klient-id'et er udfyldt, men sælger-id'et kan være nul. Med andre ord, normalt har du brug for muligheden for at have en null FK, når du måske ikke kender dens værdi på det tidspunkt, hvor dataene indtastes, men du kender andre værdier i tabellen, der skal indtastes. For at tillade nuller i en FK generelt skal du bare tillade nuller på det felt, der har FK. Nulværdien er adskilt fra ideen om, at det er en FK.

Om det er unikt eller ikke unikt, relaterer sig til, om tabellen har en en-en- eller en-mange-relation til den overordnede tabel. Hvis du nu har et en-en-forhold, er det muligt, at du kunne have alle data i én tabel, men hvis tabellen bliver for bred, eller hvis dataene er om et andet emne (medarbejderen - forsikringseksempel @tbone gav for eksempel), så vil du have separate tabeller med en FK. Du vil så gerne gøre denne FK til enten også PK (som garanterer unikhed) eller sætte en unik begrænsning på den.

De fleste FK'ere er for et en til mange forhold, og det er, hvad du får fra en FK uden at tilføje en yderligere begrænsning på banen. Så du har for eksempel en ordretabel og tabellen med ordredetaljer. Hvis kunden bestiller ti varer på én gang, har han én ordre og ti ordredetaljeposter, der indeholder samme ordre-ID som FK.



  1. Brug af Passport med Sequelize og MySQL

  2. Statisk og dynamisk datamaskering i FieldShield

  3. Sådan kontrolleres Oracle-databasen for langvarige forespørgsler

  4. DATEFROMPARTS() Eksempler i SQL Server (T-SQL)