
NULL czy NOT NULL - o to jest pytanie
Przeglądając różne kody często widzę, iż programiści nie zwracają uwagi na to, czy ich pola są NULL czy NOT NULL. Ba, swego czasu mi to tam też było wsio rybka. Jednak jest to dość ważna kwestia.... No dobra, świat się przez nią nie skończy, ale dobrze jest na to zwracać uwagę.
Jeśli nie mamy jakiś konkretnych powodów by używać wartości NULL, zawsze ustawiajmy kolumnę jako NOT NULL. Jeśli w danej kolumnie nie ma znaczenia, czy wartością kolumny jest pusty tekst (lub 0 dla kolumn liczbowych) czy też NULL, znaczy że nie potrzebujecie wartości NULL i znowu należy oznaczyć kolumnę jako NOT NULL.
Po co to wszystko? Jest parę powodów.
- Dla tabel MyISAM każda kolumna NULL zawiera dodatkowy bit extra (zaokrąglany w górę do najbliższego bajta)
- Przejrzystsze wyszukiwania, np. gdy kolumna liczbowa może przyjmować NULL lub 0 dla określenia nie wypełnienia pola lub czegoś podobnego, musicie wówczas pamiętać w zapytaniu o tych dwóch wartościach. Gdy będziecie chcieli wyciągnąć rekordy o pustej kolumnie musicie pisać
Raz że czasem można o tym zapomnieć, dwa, że często przez to zapytania wykonują się wolniej. A jakby kolumna była NOT NULL to by wystarczyło.... where KOLUMNA is null or KOLUMNA = 0
.... where KOLUMNA = 0
- Mniejsza wydajność (tak na prawdę więcej kombinacji) bazy przy pracy z indeksami założonymi na kolumnie z NULL ( dodane przez sowiq )
- Ogólnie jest to dobra praktyka. Gdy programista zwraca na to uwagę to wiadomo, że wie co robi
Oczywiście kolumny typu NULL są jak najbardziej w niektórych przypadkach potrzebne i nie da się bez nich obejść. Starajmy się jednak zwracać uwagę, czy w danym przypadku na pewno jest to nam potrzebne. Rozważmy sytuację: mamy kolumnę liczbową, w której zapisywane są dane, które wpisywał użytkownik przez formularz. Użytkownik może podać wartości nieujemne lub nie wypełnić w ogóle pola. Wówczas wartość 0 nie oznacza pustej wartości, ale normalną wartość podaną przez użytkownika. Natomiast wartość NULL mogłaby oznaczać, że użytkownik nie wypełnił danego pola. Można by tu jednak zrobić inaczej. Skoro użytkownik może wprowadzić tylko nieujemne wartości, to można przyjąć że wartość -1 oznaczać będzie niewypełnienie pola i pole oznaczyć jako NOT NULL. Sztuka dla sztuki? Być może