Definicja kolumny SQL: wartość domyślna i czy nie ma wartości null nadmiarowej?


86

Wiele razy widziałem następującą składnię, która definiuje kolumnę w instrukcji create / alter DDL:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

Pytanie brzmi: skoro określono wartość domyślną, czy konieczne jest również określenie, że kolumna nie powinna akceptować wartości NULL? Innymi słowy, czy DEFAULT nie czyni NOT NULL zbędnym?

Odpowiedzi:


126

DEFAULTto wartość, która zostanie wstawiona w przypadku braku jawnej wartości w instrukcji wstawiania / aktualizowania. Załóżmy, że Twój DDL nie miał NOT NULLograniczenia:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"

Wtedy mógłbyś wydać takie oświadczenia

-- 1. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

Alternatywnie możesz również użyć DEFAULTw UPDATEinstrukcjach, zgodnie ze standardem SQL-1992 :

-- 5. This will update "MyDefault" into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

Należy zauważyć, że nie wszystkie bazy danych obsługują wszystkie te standardowe składnie języka SQL. Dodanie NOT NULLograniczenia spowoduje błąd w instrukcjach 4, 6, mimo że 1-3, 5nadal są poprawnymi instrukcjami. A więc odpowiadając na twoje pytanie: nie, nie są one zbędne.


Poszedłem do twojego linku (do twojego posta na blogu), spodziewając się wyjaśnienia (być może z pewnymi liczbami) ogromnego wpływu na wydajność zapytania, ale zobaczyłem tylko krótko, że ma to wpływ. Bez obrazy, ale link jest trochę mylący.
Seth Flowers

@SethFlowers: Dzięki za wskazówkę, Seth. W międzyczasie powiązany artykuł był edytowany. Zobaczę, czy mogę zamiast tego utworzyć link do czegoś innego, czy usunąć łącze. Tak jak teraz, masz absolutną rację, nie dodaje to żadnej wartości do odpowiedzi tutaj.
Lukas Eder

Dzięki - mam nadzieję, że nie brzmię niegrzecznie. Właśnie zobaczyłem link i pomyślałem „tak, to zdecydowanie coś, co chcę przeczytać” - wtedy byłem trochę zawiedziony :).
Seth Flowers

@SethFlowers: Bez obaw. Całkowicie się zgadzam. Na ratunek: Moje umiejętności blogowania znacznie się poprawiły w ciągu ostatnich lat :)
Lukas Eder

19

Nawet przy wartości domyślnej zawsze możesz zastąpić dane kolumny za pomocą null.

NOT NULLOgraniczenie nie pozwoli zaktualizować ten wiersz po to został stworzony z nullwartością


Myślę, że powinno to zostać przeformułowane: "Ograniczenie NOT NULL nie pozwoli ci zaktualizować tego wiersza po utworzeniu go z wartością null" Oczywiście wiersze z kolumnami NOT NULL można zaktualizować, po prostu nie można ich zaktualizować null jako wartość dla tej kolumny. Ponadto: Zakładam, że utworzenie wiersza oznacza wstawienie wiersza. Instrukcje INSERT nie mogą również zawierać wartości null dla kolumn, dla których określono wartość NOT NULL.
makrom

4

Mój nauczyciel języka SQL powiedział, że jeśli podasz zarówno DEFAULTwartość, jak i NOT NULLlub NULL, DEFAULTzawsze należy je wyrazić przed NOT NULLlub NULL.

Lubię to:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL


5
Cześć i dziękuję za udział. Nie rozwiązuje to jednak aktualnego pytania, a oba porządki są w pełni skuteczne. Uważam, że łatwiej jest ustawić wartość domyślną na końcu, gdy ręcznie skryptuję tabele, ponieważ wtedy wartości NULL i NOT NULL są lepiej wyrównane.
emragins

Okej, myślę, że też masz rację. Nie rozumiem, dlaczego mój kurs wyraźnie mówi o tym, co napisałem w odpowiedzi. Wiem, że moja odpowiedź tak naprawdę nie odnosi się do pytania, ale stwierdziłem, że komentarz nie byłby zbyt czytelny.
Tanguy Labrador Ruiz

3
Istnieje różnica między (subiektywną) najlepszą praktyką a zasadami. Nie jest złym pomysłem posiadanie spójnego stylu, ale w tym konkretnym przypadku osobiście wolałbym NOT NULL przed DEFAULT. Niezależnie od tego, zamiast odpowiedzi możesz także pisać komentarze, byłoby to bardziej odpowiednie.
makrom

To prawdopodobnie nie odpowiada na pytanie. Ale to jest dokładnie to, czego szukałem. Dziękuję Ci.
Sasuke Uchiha

2

Powiedziałbym, że nie.

Jeśli kolumna akceptuje wartości null, nic nie stoi na przeszkodzie, aby wstawić wartość null do pola. O ile mi wiadomo, wartość domyślna ma zastosowanie tylko przy tworzeniu nowego wiersza.

Jeśli nie ustawiono wartości null, nie można wstawić wartości null do pola, ponieważ spowoduje to zgłoszenie błędu.

Potraktuj to jako bezpieczny mechanizm zapobiegający zerom.


2
Powiedziałeś „stworzenie nowej reguły”. Czy zamierzałeś powiedzieć „utworzenie nowego wiersza”?
bielawski

Myślę, że to bardziej praktyczna odpowiedź na to pytanie.
Noman_ibrahim

@bielawski I prawie 8 lat później zaczynam poprawiać tę literówkę :)
Dark Hippo

To powinna być akceptowana odpowiedź. OP prosi o proste pytanie, a odpowiedź brzmi po prostu „nie”. Potrzebne jest jednak wyjaśnienie i przykład w przypadku dokumentacji.
Nicolas Hevia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.