SQL: używanie wartości NULL a wartości domyślne

Jakie są Plusy i minusy używania wartości NULL w SQL w przeciwieństwie do wartości domyślne?

PS. Wiele podobnych pytań zostało tutaj zadanych, ale żadne nie odpowiada na moje pytanie.

Author: STW, 2010-01-22

13 answers

Wartością NULL w bazach danych jest system wartość, która zajmuje jeden bajt storage i wskazuje, że wartość jest nie występuje w przeciwieństwie do spacji lub zero lub inna wartość domyślna. Na pole w bazie danych zawierającej Wartość NULL oznacza, że zawartość Komórka ta jest nieznana w czasie patrzę na to. Kolumna, która pozwala Wartości NULL pozwalają również na wstawione bez żadnych wartości w tym kolumna. Jest kilka plusów i wady używania NULL wartości w przeciwieństwie do wartości domyślnych:

Plusy

Wartość NULL nie posiada danych typu, dlatego można wstawić do dowolnego struktura danych i Dowolna baza danych kolumna. Wartości domyślne, z drugiej strony ręcznie, muszą mieć swój typ danych określona i domyślna wartość w jednym kolumna może wyglądać tak samo w innym kolumna, ale może być inna Typ.

NULL jest często używany w schematach, gdzie wartość jest opcjonalna. Jest to wygodne metoda pominięcia wprowadzania danych dla nieznane pola bez konieczności wprowadzić dodatkowe zasady, takie jak przechowywanie wartości ujemnych w liczbie całkowitej pole do reprezentowania pominiętych danych.

Ponieważ wartość NULL zajmuje tylko 1 trochę miejsca na pamięć, mogą być przydatne przy optymalizacji bazy danych. Korzystanie z tych wartości jest znacznie więcej efektywne od wartości domyślnych, np. 8 bitów postaci i liczba całkowita 16 bitów.

Podczas gdy twoje wymagania systemowe mogą zmiana w czasie i wartość domyślna typy z nimi, wartość NULL jest zawsze NULL więc nie ma potrzeby aktualizacji rodzaj danych.

Przypisywanie Not Null do schematów tabeli może również pomóc w walidacji tabeli, w tym sensie, że kolumna z nie Kryteria Null będą wymagały wartości do być wstawione. Wartości domyślne nie mieć takie możliwości.

Cons

Wartości NULL łatwo pomylić z puste ciągi znaków, które zwracają pusta wartość dla użytkownika kiedy wybrane. W tym sensie domyślne wartości są mniej mylące i są opcja bezpieczniejsza, chyba że wartość domyślna jest ustawiony na pusty łańcuch.

Jeśli wartości NULL są dozwolone w bazy danych, mogą one spowodować, że projektant trochę dodatkowego czasu i pracy, jak mogą zwiększ logikę bazy danych skomplikowane, zwłaszcza gdy są wiele porównań do wartości null w miejsce.

Źródło: za i przeciw

 46
Author: R van Rijn,
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
2010-01-22 15:15:22

Nie wiem, dlaczego próbujesz je porównywać do spraw. null oznacza, że jakaś kolumna jest pusta/nie ma wartości, podczas gdy wartość domyślna daje kolumnie jakąś wartość, gdy nie ustawiamy jej bezpośrednio w zapytaniu.

Może jakiś przykład będzie lepszym wyjaśnieniem. Załóżmy, że mamy member tabelę. Każdy członek ma identyfikator i nazwę użytkownika. Opcjonalnie może mieć adres e-mail (ale nie musi). Ponadto każdy członek ma kolumnę postCount (która jest zwiększana za każdym razem, gdy użytkownik pisze post). Więc e-mail kolumna może mieć wartość null (ponieważ e-mail jest opcjonalny), natomiast kolumna postCount to NOT NULL, ale ma domyślną wartość 0 (ponieważ kiedy tworzymy nowego członka, nie ma on żadnych postów).

 19
Author: Crozin,
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-05-03 05:29:05

Wartości Null nie są ... wartości!

Null oznacza 'nie ma wartości'... oprócz aspektu bazy danych, jednym z ważnych wymiarów nieocenianych zmiennych lub pól jest to, że nie można używać '=' (lub'>','

Zapisywanie czegoś w rodzaju (VB):

if myFirstValue = mySecondValue

Nie zwróci True lub False, jeśli jedna lub obie zmienne nie są wartościowane. Będziesz musiał użyć 'turnaround', takiego jak:

if (isnull(myFirstValue) and isNull(mySecondValue)) or myFirstValue = mySecondValue

"zwykły" kod używany w takich okolicznościach is

if Nz(myFirstValue) = Nz(mySecondValue, defaultValue)

Nie jest ściśle poprawna, ponieważ nieocenione zmienne będą uważane za "równe" wartości "defaultValue" (Zwykle ciąg o zerowej długości).

Pomimo tego nieprzyjemnego zachowania, never never never włączaj domyślne wartości na ciąg o zerowej długości (lub '0') bez wartościowego powodu, a Łatwe Porównywanie wartości w kodzie nie jest wartościowym powodem.

 13
Author: Philippe Grondier,
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
2010-01-22 13:14:21

Wartości NULL oznaczają, że atrybut nie ma zastosowania lub jest nieznany. Są wojny religijne toczone o to, czy są dobre, czy złe, ale ja upadam w obozie "dobra rzecz".

Są one często niezbędne do odróżnienia znanych wartości od nieznanych wartości w wielu sytuacjach i sprawiają, że wartość sentinel jest niepotrzebna dla tych atrybutów, które nie mają odpowiedniej wartości domyślnej.

Na przykład, podczas gdy domyślna wartość salda bankowego może być zero, jaka jest domyślna wartość dla numeru telefonu komórkowego. Może być konieczne rozróżnienie między "klient nie ma telefonu komórkowego" i "numer telefonu komórkowego klienta nie jest (jeszcze) znany" w takim przypadku pusta kolumna nie wystarczy (a posiadanie dodatkowej kolumny, aby zdecydować, czy kolumna jest jedna czy druga, nie jest dobrym pomysłem).

Domyślne wartości są po prostu tym, co DBMS umieści w kolumnie, jeśli nie podasz jej jawnie.

 7
Author: paxdiablo,
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
2010-01-22 11:11:04

To zależy od sytuacji, ale to naprawdę proste. Który jest bliżej prawdy?

Wiele osób traktuje dane tak, jakby to były tylko dane, a prawda nie ma znaczenia. Jednak za każdym razem, gdy rozmawiasz z interesariuszami w danych, przekonujesz się, że prawda zawsze ma znaczenie. czasem więcej, czasem mniej, ale to zawsze ma znaczenie.

Wartość domyślna jest przydatna, gdy można założyć, że jeśli użytkownik (lub inne źródło danych) podał wartość, wartość ta będzie miała to było domyślne. Jeśli to założenie wyrządza więcej szkody niż pożytku, wtedy NULL jest lepsze, nawet jeśli radzenie sobie z NULL jest bólem w SQL.

Zauważ, że istnieją trzy różne sposoby implementacji wartości domyślnych. Najpierw w aplikacji, przed wstawieniem nowych danych. Baza danych nigdy nie widzi różnicy między wartością domyślną podaną przez użytkownika lub podaną przez aplikację!

Po drugie, deklarując domyślną wartość dla kolumny i pozostawiając brakujące dane w insert.

Po Trzecie, podstawiając wartość domyślną w czasie pobierania, za każdym razem, gdy zostanie wykryte NULL. Tylko kilka produktów DBMS pozwala na zadeklarowanie tego trzeciego trybu w bazie danych.

W idealnym świecie danych nigdy nie brakuje. Jeśli rozwijasz się w realnym świecie, wymagane dane w końcu znikną. Twoje aplikacje mogą albo zrobić coś, co ma sens, albo coś, co nie ma sensu, gdy tak się dzieje.

 5
Author: Walter Mitty,
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
2010-01-22 13:53:00

Jak w przypadku wielu rzeczy, są dobre i złe punkty do każdego.

Dobre punkty dotyczące wartości domyślnych: dają możliwość ustawienia kolumny na znaną wartość, jeśli nie podano innej wartości. Na przykład, podczas tworzenia kolumn logicznych Zwykle nadaję kolumnie wartość domyślną (TRUE lub FALSE, cokolwiek jest właściwe) i sprawiam, że kolumna nie jest NULL. W ten sposób mogę mieć pewność, że kolumna będzie miała wartość i będzie ustawiona odpowiednio.

Złe punkty dotyczące wartości domyślnych: nie wszystko ma wartość domyślną.

Dobre rzeczy o Nullach: nie wszystko ma znaną wartość przez cały czas. Na przykład, tworząc nowy wiersz reprezentujący osobę, mogę nie mieć wartości dla wszystkich kolumn - powiedzmy, że znam ich imię, ale nie datę urodzenia. Nie jest właściwe wprowadzanie domyślnej wartości dla Daty Urodzenia - ludzie nie lubią dostawać kartek urodzinowych 1 stycznia (jeśli jest to domyślne), jeśli ich urodziny są faktycznie 22 lipca.

Złe Rzeczy o NULLs: NULLs wymagają starannej obsługi. W większości baz danych zbudowanych na modelu relacyjnym, jak powszechnie zaimplementowane null są trucizną - obecność NULL w obliczeniach powoduje, że wynik obliczeń jest NULL. Null używane w porównaniach może również powodować nieoczekiwane wyniki, ponieważ każde porównanie z NULL zwraca UNKNOWN (co nie jest ani prawdą, ani fałszem). Na przykład rozważ następujący skrypt PL / SQL:

declare 
  nValue NUMBER;
begin
  IF nValue > 0 THEN
    dbms_output.put_line('nValue > 0');
  ELSE
    dbms_output.put_line('nValue <= 0');
  END IF;

  IF nValue <= 0 THEN
    dbms_output.put_line('nValue <= 0');
  ELSE
    dbms_output.put_line('nValue > 0');
  END IF;
end;

Wynik powyższego to:

nValue <= 0
nValue > 0

To może być trochę zaskakujące. Masz liczbę (nValue), która jest zarówno mniejsza lub równa zeru, jak i większa od zera, przynajmniej zgodnie z tym kodem. Powodem tego jest to, że nValue jest w rzeczywistości NULL, a wszystkie porównania z NULL dają wynik nieznany zamiast TRUE lub FALSE. Może to spowodować subtelne błędy, które są trudne do wykrycia.

Podziel się i ciesz się.
 5
Author: Bob Jarvis - Reinstate Monica,
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
2010-01-26 19:03:33

Dla mnie są nieco ortogonalne.

Wartości domyślne pozwalają z wdziękiem rozwijać schemat bazy danych (myśleć o dodawaniu kolumn) bez konieczności modyfikowania kodu klienta. Poza tym oszczędzają trochę pisania, ale poleganie na domyślnych wartościach jest IMO złe.

NULL to po prostu: null S. brakująca wartość i ogromna PITA, gdy mamy do czynienia z Trójwartościową logiką .

 4
Author: Anton Gogolev,
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
2010-01-22 11:00:39

W hurtowni danych zawsze chciałbyś mieć wartości domyślne, a nie null.

Zamiast tego masz wartość taką jak "Nieznany","nie gotowy","brakujący"

Pozwala to na wydajne wykonywanie połączeń wewnętrznych w tabelach fakt i wymiar, ponieważ "wszystko zawsze ma wartość"

 4
Author: adolf garlic,
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
2010-01-22 16:40:58

Nullwartości s i domyślne to różne rzeczy używane do różnych celów. Jeśli próbujesz uniknąć używania null s, podając wszystkim wartość domyślną, jest to słaba praktyka, jak wyjaśnię.

Null oznacza to, że nie wiemy, jaka jest lub będzie wartość. Załóżmy na przykład, że masz pole enddate. Nie wiesz, kiedy nagrywany proces się zakończy, więc null jest jedyną odpowiednią wartością; użycie domyślnej wartości jakiejś fałszywej daty w przyszłości spowoduje, że wiele problemów z programowaniem jako Obsługa nulls i jest bardziej prawdopodobne z mojego doświadczenia, aby stworzyć problem z nieprawidłowymi wynikami są zwracane.

Teraz są chwile, kiedy możemy wiedzieć, jaka powinna być wartość, jeśli osoba wstawiająca rekord nie wie. Na przykład, jeśli masz pole date inserted, należy mieć domyślną wartość bieżącej daty i nie oczekiwać, że użytkownik to wypełni. Prawdopodobnie będziesz miał lepsze informacje w ten sposób dla tego pola.

Czasami jest to wezwanie do oceny i zależy od zasad biznesowych, które musisz zastosować. Załóżmy, że masz pole speaker honoraria (które jest kwotą, którą głośnik otrzyma). Domyślna wartość 0 może być niebezpieczna, ponieważ może oznaczać, że głośniki są wynajęte i nie zamierzamy im nic płacić. Możliwe jest również, że czasami mogą być prelegenci, którzy poświęcają swój czas na konkretny projekt (lub którzy są pracownikami firmy, a tym samym nie płacą dodatkowo za mówienie), gdzie zero jest poprawną wartością, więc nie możesz użyć zera jako wartości, aby określić, że nie wiesz, ile ten głośnik ma zostać zapłacony. W tym przypadku Null jest jedyną odpowiednią wartością i Kod powinien wywołać problem, jeśli ktoś spróbuje dodać mówcę do konferencji. W innej sytuacji możesz już wiedzieć, że minimalna płaca każdego mówcy wynosi 3000 i że tylko mówcy, którzy wynegocjowali inną stawkę, będą mieli dane wprowadzone w polu honoraria. W takim przypadku należy aby wprowadzić domyślną wartość 3000. W innych przypadkach, różne klienty mogą mieć różne minimum, więc domyślną wartość należy traktować inaczej (zwykle za pomocą tabeli wyszukiwania, która automatycznie zapełnia minimalną wartość honoraria dla tego klienta w formularzu wprowadzania danych.

Więc uważam, że najlepszą zasadą jest pozostawienie wartości jako null, jeśli naprawdę nie możesz wiedzieć w momencie wprowadzania danych, Jaka powinna być wartość pola. Użyj domyślnej wartości tylko to ma znaczenie cały czas dla tego konkretnej sytuacji i użyć innej techniki, aby wypełnić wartość, jeśli może być inna w różnych okolicznościach.

 4
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-12-20 19:52:17

Doceniam całą tę dyskusję. Jestem w trakcie budowy hurtowni danych i używam modelu Kimballa raczej ściśle. Jest jednak jeden bardzo wokalny użytkownik, który nienawidzi zastępczych klawiszy i chce null wszędzie. Powiedziałem mu, że to jest w porządku, aby mieć NULLable kolumny dla atrybutów wymiarów i dla wszelkich dat lub liczb, które są używane w obliczeniach, ponieważ domyślne wartości tam implikują błędne dane. Są, zgadzam się, zalety zezwalania na NULL w niektórych kolumnach ale to sprawia, że cubing jest o wiele lepszy i bardziej niezawodny, jeśli istnieje klucz zastępczy dla każdego klucza obcego do wymiaru, nawet jeśli ten klucz zastępczy to -1 lub 0 dla fałszywego rekordu. SQL lubi liczby całkowite dla złączeń i jeśli brakuje wartości wymiaru, a atrapa jest dostarczana jako klucz zastępczy, to Otrzymasz taką samą liczbę rekordów przy użyciu jednego wymiaru, jak w przypadku innego wymiaru. Jednak obliczenia muszą być wykonane poprawnie i musisz uwzględnić w nich wartości NULL. Urodziny powinny być NULL tak, że wiek nie jest obliczany, na przykład. Wierzę w dobre zarządzanie danymi i podejmowanie tych decyzji z użytkownikami zmusza ich do myślenia o swoich danych na więcej sposobów niż kiedykolwiek.

 4
Author: Diana Bodell,
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
2020-01-11 05:05:43

Jak już powiedział jeden z respondentów, NULL nie jest wartością.

Bądź bardzo ostrożna z tym, co głosi każdy, kto mówi o" wartości zerowej " tak, jakby była wartością.

NULL nie jest równe sobie. x = y daje false, jeśli zarówno x, jak i y są NULL. x = y daje wartość true, jeśli zarówno X, jak i y są wartością domyślną.

Są prawie nieskończone konsekwencje tej pozornie bardzo prostej różnicy. A większość z tych konsekwencji to pułapki, które bardzo cię gryzą.

 1
Author: Erwin Smout,
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
2010-01-22 22:53:21

Dwa bardzo dobre artykuły o Nullach Allena Browne ' a:

Aspekty pracy z Null w kodzie VBA:

Artykuły są zorientowane na dostęp, ale mogą być cenne dla osób korzystających z dowolnej bazy danych, szczególnie względnych nowicjuszy ze względu na konwersacyjny styl pisania.

 0
Author: David-W-Fenton,
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
2010-01-22 23:21:13

Null nigdy nie oszczędza miejsca w DB2 dla OS/390 i z/OS. Każda kolumna nullable wymaga jednego dodatkowego bajtu pamięci dla wskaźnika null. Tak więc kolumna CHAR (10), która jest nullable, będzie wymagała 11 bajtów pamięci na wiersz – 10 dla danych i 1 dla wskaźnika null. Dzieje się tak niezależnie od tego, czy kolumna jest ustawiona na null, czy nie.

DB2 dla Linuksa, Unixa i Windows ma opcję kompresji, która pozwala kolumnom ustawionym na null zaoszczędzić miejsce. Użycie tej opcji powoduje, że DB2 aby wyeliminować nieużywane miejsce z wiersza, w którym kolumny są ustawione na null. Ta opcja nie jest jednak dostępna na komputerze mainframe.

REF: http://www.craigsmullins.com/bp7.htm

Więc najlepszą praktyką modelowania dla DB2 Z / OS jest użycie" NOT NULL WITH DEFAULT " jako standardu dla wszystkich kolumn. Tak samo było w niektórych dużych sklepach, które znałem. Sprawia, że życie programistów jest łatwiejsze, nie trzeba obsługiwać wskaźnika zerowego i faktycznie oszczędza pamięć, eliminując potrzebę aby użyć dodatkowego bajtu dla wskaźnika NULL.

 0
Author: Prasad Alla,
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
2012-12-10 10:10:38