Czy klucz obcy może być NULL i / lub duplikat?

Proszę wyjaśnij mi dwie rzeczy:

  1. czy klucz obcy może być NULL?
  2. czy klucz obcy może być duplikowany?

Z tego co wiem, NULL nie powinno być używane w kluczach obcych, ale w niektórych moich aplikacjach mogę wprowadzić NULL zarówno w Oracle, jak i SQL Server i nie wiem dlaczego.

Author: halfer, 2011-09-27

10 answers

Krótka odpowiedź: Tak, może być NULL lub duplikat.

Chcę wyjaśnić, dlaczego klucz obcy musi być null lub musi być unikalny lub nie unikalny. Najpierw zapamiętaj klucz obcy po prostu wymaga, aby wartość w tym polu istniała najpierw w innej tabeli (tabeli nadrzędnej). To wszystko FK jest z definicji. Null z definicji nie jest wartością. Null oznacza, że nie wiemy jeszcze, jaka jest wartość.

Dam ci przykład z prawdziwego życia. Załóżmy, że masz bazę danych które przechowują propozycje sprzedaży. Załóżmy ponadto, że każda propozycja ma tylko jedną osobę sprzedającą przypisaną i jednego klienta. Więc twoja tabela propozycji będzie miała dwa klucze obce, jeden z identyfikatorem klienta i jeden z identyfikatorem przedstawiciela handlowego. Jednak w momencie tworzenia rekordu, przedstawiciel handlowy nie zawsze jest przypisany (ponieważ nikt nie może jeszcze nad nim pracować), więc identyfikator klienta jest wypełniany, ale identyfikator przedstawiciela handlowego może być null. Innymi słowy, zwykle potrzebujesz możliwości posiadania null FK, gdy możesz nie wiedzieć jego wartość w momencie wprowadzania danych, ale znasz inne wartości w tabeli, które należy wprowadzić. Aby zezwolić nulls w FK ogólnie wszystko, co musisz zrobić, to zezwolić nulls na polu, które ma FK. Wartość null jest oddzielona od idei, że jest FK.

To, czy jest unikalna, czy nie jest unikalna, odnosi się do tego, czy tabela ma relację jeden-jeden lub jeden-wiele do tabeli nadrzędnej. Teraz, jeśli masz jeden-jeden związek, możliwe jest, że możesz mieć wszystkie dane w jedna tabela, ale jeśli tabela jest zbyt szeroka lub jeśli dane są na inny temat( przykład pracownik-ubezpieczenia podał na przykład @tbone), to chcesz oddzielne tabele z FK. Następnie chciałbyś uczynić ten FK albo PK (co gwarantuje wyjątkowość) lub umieścić na nim unikalne ograniczenie.

Większość FKs jest dla relacji jeden do wielu i to jest to, co otrzymujesz z FK bez dodawania dodatkowego ograniczenia na polu. Więc masz tabelę zamówień i szczegóły zamówienia na przykład stół. Jeśli klient zamawia dziesięć pozycji w jednym czasie, ma jedno zamówienie i dziesięć zapisów szczegółów zamówienia, które zawierają ten sam orderID co FK.

 366
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 12:35:09

1 - tak, od co najmniej SQL Server 2000.

2-tak, o ile nie jest to ograniczenie UNIQUE lub powiązane z unikalnym indeksem.

 45
Author: JNK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-27 18:02:22

Z paszczy konia:

Klucze obce pozwalają na wartości kluczy, które są wszystkie NULL, nawet jeśli nie ma pasujące klucze podstawowe lub unikalne

Brak ograniczeń w kluczu obcym

Gdy na kluczu obcym nie są zdefiniowane żadne inne ograniczenia, dowolna liczba wiersze w tabeli potomnej mogą odwoływać się do tej samej wartości klucza nadrzędnego. Model ten pozwala na NULL w kluczu obcym. ...

NOT NULL Constraint on the Foreign Key

Gdy NULL nie jest dozwolone w klucz obcy, każdy wiersz w tabeli podrzędnej musi wyraźnie odwoływać się do wartość w kluczu nadrzędnym, ponieważ NULL nie są dozwolone w obcym klucz.

Dowolna liczba wierszy w tabeli potomnej może odwoływać się do tego samego rodzica kluczowa wartość, więc model ten ustanawia relację jeden do wielu pomiędzy rodzicem a zagranicznymi kluczami. Jednak każdy rząd dziecka tabela musi zawierać odniesienie do wartości klucza nadrzędnego; brak wartość (null) w klucz obcy jest niedozwolony. Ten sam przykład w poprzednia sekcja może być wykorzystana do zilustrowania takiej relacji. Jednak w tym przypadku pracownicy muszą mieć odniesienie do konkretnego Wydział.

Unikalne ograniczenie klucza obcego

Gdy unikalne ograniczenie jest zdefiniowany na kluczu obcym, tylko jeden wiersz w tabeli potomnej może odwołuje się do podanej wartości klucza nadrzędnego. Model ten umożliwia null w klucz obcy.

Ten model ustanawia relacja jeden do jednego między rodzicem oraz klucze obce, które pozwalają na nieokreślone wartości (Null) w klucz obcy. Załóżmy na przykład, że tabela pracowników ma kolumnę o nazwie MEMBERNO, odnoszącej się do numeru członkowskiego pracownika w plan ubezpieczenia firmy. Również tabela o nazwie ubezpieczenia ma podstawową klucz o nazwie MEMBERNO, a inne kolumny tabeli zachowują odpowiednie informacje dotyczące polisy ubezpieczeniowej pracownika. MEMBERNO w stół pracowniczy musi być zarówno klucz obcy i klucz niepowtarzalny:

  • Aby wyegzekwować odsyłające reguły integralności pomiędzy EMP_TAB i Tablice ubezpieczeniowe (ograniczenie klucza obcego)

  • Aby zagwarantować, że każdy pracownik ma unikalny numer członkowski ( Unikalne ograniczenie klucza)

Unikalne i nie NULL ograniczenia klucza obcego

Gdy oba unikalne i nie NULL ograniczenia są zdefiniowane na kluczu obcym, tylko jeden wiersz w dziecięcym stole może odwoływać się do danej wartości klucza nadrzędnego, a ponieważ Wartości NULL nie są dozwolone w kluczu obcym, w każdym wierszu potomka tabela musi jawnie odwoływać się do wartości w kluczu nadrzędnym.

Zobacz to:

Oracle 11g link

 35
Author: tbone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-05 21:42:49

Tak klucz obcy może być null, jak powiedziano powyżej przez starszych programistów... Dodałbym jeszcze jeden scenariusz, w którym klucz obcy musi być null.... Załóżmy, że mamy tabele komentarze, zdjęcia i filmy w aplikacji, która pozwala na komentarze do zdjęć i filmów. W tabeli komentarzy możemy mieć dwa klucze obce Imagesid i VideosId wraz z kluczem głównym CommentId. Więc kiedy komentujesz film, wymagany będzie tylko VideosId, a pictureId będzie null... a jeśli skomentujesz wymagany byłby tylko obraz PictureId, a VideosId byłby null...

 10
Author: Touseef Ahmed Awan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 17:41:39

To zależy, jaką rolę foreign key odgrywa w twojej relacji.

  1. jeśli to foreign key jest również key attribute w twojej relacji, to nie może być NULL
  2. jeśli foreign key jest normalnym atrybutem w twojej relacji, to może być NULL.
 5
Author: shinxg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 03:32:09

Oto przykład użycia składni Oracle:
Najpierw utwórzmy kraj tabeli

CREATE TABLE TBL_COUNTRY ( COUNTRY_ID VARCHAR2 (50) NOT NULL ) ;
ALTER TABLE TBL_COUNTRY ADD CONSTRAINT COUNTRY_PK PRIMARY KEY ( COUNTRY_ID ) ;

Tworzenie prowincji tabeli

CREATE TABLE TBL_PROVINCE(
PROVINCE_ID VARCHAR2 (50) NOT NULL ,
COUNTRY_ID  VARCHAR2 (50)
);
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_PK PRIMARY KEY ( PROVINCE_ID ) ;
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_COUNTRY_FK FOREIGN KEY ( COUNTRY_ID ) REFERENCES TBL_COUNTRY ( COUNTRY_ID ) ;
To działa idealnie w Oracle. Zauważ, że klucz obcy COUNTRY_ID w drugiej tabeli nie ma "NOT NULL".

Teraz, aby wstawić wiersz do tabeli prowincji, wystarczy podać tylko identyfikator prowincji. Jeśli jednak zdecydujesz się podać również COUNTRY_ID, musi on istnieć już w tabeli krajów.

 3
Author: Mouhcine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-19 15:46:31

Domyślnie nie ma ograniczeń dla klucza obcego, klucz obcy może być null i duplikat.

Podczas tworzenia tabeli / zmieniania tabeli, jeśli dodasz jakąkolwiek ograniczenie unikalności lub nie null, to tylko ona nie pozwoli na wartości null/ duplikat.

 1
Author: nitin lalwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 19:54:01

Mówiąc najprościej," nieidentyfikujące " relacje między podmiotami są częścią ER-modelu i są dostępne w Microsoft Visio podczas projektowania ER-diagramu. Jest to wymagane do wymuszenia kardynalności między podmiotami typu "zero lub więcej niż zero" lub "zero lub jeden". Zauważ to "zero" w kardynalności zamiast "jeden" w "jeden do wielu".

Przykładem nieidentyfikującej relacji, w której cardinalność może być "zero" (nieidentyfikująca) jest wtedy, gdy mówimy rekord / obiekt w jednym bycie - "może" lub " może nie " mają wartość jako odniesienie do rekordu/s w innym podmiocie-B.

Ponieważ istnieje możliwość, że jeden rekord entity-A identyfikuje się z rekordami innej Entity-B, dlatego powinna istnieć kolumna w Entity-B, która ma wartość tożsamościową rekordu Entity-B. Ta kolumna może być "Null", jeśli żaden rekord w Entity-A nie identyfikuje rekordu/s (lub obiektu/s) W Entity-B.

W paradygmacie zorientowanym obiektowo (świat rzeczywisty) istnieją sytuacje, w których obiekt klasy-B nie zawsze zależy (silnie sprzężony) od obiektu klasy-a jego istnienia, co oznacza, że Klasa-B jest luźno sprzężona z klasą-A tak, że Klasa-A może "zawierać" (ograniczać) obiekt klasy-a, w przeciwieństwie do pojęcia obiektu klasy-B musi mieć (skład) obiekt klasy-A, dla swojego (obiektu klasy-B) stworzenia.

Z punktu widzenia zapytania SQL, możesz odpytywać wszystkie rekordy w encji-B, które są "nie null" dla klucza obcego zarezerwowanego dla encji-B. spowoduje to rekordy posiadające pewną odpowiadającą im wartość dla wierszy w encji-a alternatywnie wszystkie rekordy z wartością Null będą rekordami, które nie mają żadnego rekordu w encji-a w encji-B.

 0
Author: Fakhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 05:57:31

Myślę, że lepiej wziąć pod uwagę możliwą Kardynalność, jaką mamy w tabelach. Możemy mieć możliwą minimalną Kardynalność zero. Jeśli jest to opcjonalne, minimalny udział krotek z powiązanej tabeli może wynosić zero, teraz musisz zmierzyć się z koniecznością, aby wartości klucza obcego mogły być równe null.

Ale odpowiedź brzmi: wszystko zależy od biznesu.

 -1
Author: user9274383,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-26 22:28:10

Myślę, że klucz obcy jednej tabeli również klucz podstawowy do innej table.So nie pozwoli nulls.So nie ma mowy o posiadaniu wartości null w kluczu obcym.

 -5
Author: user4532553,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 10:53:52