Podczas tworzenia tabeli w SQLite masz możliwość dodania ograniczeń do każdej kolumny.
Jednym z takich ograniczeń jest DEFAULT
ograniczenie.
DEFAULT
ograniczenie umożliwia określenie wartości, która zostanie użyta w przypadku, gdy dla tej kolumny nie zostanie podana żadna wartość po wstawieniu nowego wiersza.
Jeśli nie użyj DEFAULT
klauzula, wtedy domyślną wartością kolumny jest NULL
.
Możliwe wartości domyślne
Jawna wartość domyślna DEFAULT
ograniczeniem może być dowolne z poniższych:
- stała łańcuchowa
- stała kropla
- podpisany numer
- dowolne wyrażenie stałe ujęte w nawiasy.
CURRENT_TIME
CURRENT_DATE
CURRENT_TIMESTAMP
NULL
Przykład
Oto przykład do zademonstrowania.
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName,
Price DEFAULT 0.00
);
Tutaj dodałem DEFAULT
ograniczenie Ceny kolumna. W tym przypadku wartość domyślna to 0.00 .
Teraz, gdy wstawiam nowy wiersz bez określania wartości Cena kolumna, używana jest wartość domyślna.
INSERT INTO Products ( ProductId, ProductName )
VALUES (1, 'Long Weight');
SELECT * FROM Products;
Wynik:
ProductId ProductName Price ---------- ----------- ---------- 1 Long Weight 0.0
Wyraźne wartości
Oczywiście wartość domyślna jest używana tylko wtedy, gdy nie podasz jawnie wartości. Jeśli tak, to ta wartość jest używana zamiast tego.
Oto kolejny przykład. Tym razem wyraźnie podaję wartość tej Ceny kolumna.
INSERT INTO Products ( ProductId, ProductName, Price )
VALUES (2, 'Left-Handed Screwdriver', 19.99);
SELECT * FROM Products;
Wynik:
ProductId ProductName Price ---------- ------------------------- ---------- 1 Long Weight 0.0 2 Left-Handed Screwdriver 19.99
Wyraźne wartości NULL
Poprzedni przykład dotyczy również jawnie podanego NULL
wartości.
Aby to zademonstrować, oto co się stanie, jeśli jawnie wstawię NULL
do Ceny kolumna.
INSERT INTO Products ( ProductId, ProductName, Price )
VALUES (3, 'Elbow Grease', NULL);
SELECT * FROM Products;
Wynik:
ProductId ProductName Price ---------- ------------------------ ---------- 1 Long Weight 0.0 2 Left-Handed Screwdriver 19.99 3 Elbow Grease
Tym razem Cena kolumna ma wartość NULL
, ponieważ to właśnie wstawiłem do tej kolumny.
Aby temu zapobiec, zobacz Jak przekonwertować wartości NULL na domyślną wartość kolumny podczas wstawiania danych do SQLite.
Domyślna sygnatura czasowa
W tym przykładzie tworzę kolejną tabelę. Tym razem ustawiłem domyślną wartość na bieżący znacznik czasu.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type,
DateInserted DEFAULT CURRENT_TIMESTAMP
);
A teraz trochę danych.
INSERT INTO Types (Type)
VALUES ( 'Hardware' );
SELECT * FROM Types;
Wynik:
TypeId Type DateInserted ---------- ---------- ------------------- 1 Hardware 2020-06-05 00:21:57
Znacznik czasu został wstawiony zgodnie z oczekiwaniami.
Automatyczne zwiększanie wartości jako wartość domyślna
Zauważ, że w poprzednim przykładzie nie podałem również wartości dla TypeId kolumna, ale i tak automatycznie wygenerowała wartość domyślną.
W tym przypadku wartość domyślna nie wynikała z DEFAULT
ograniczenie. Wynikało to z faktu, że kolumna jest kolumną klucza podstawowego, która została utworzona za pomocą INTEGER PRIMARY KEY
. Kiedy definiujesz kolumnę za pomocą INTEGER PRIMARY KEY
, kolumna automatycznie staje się kolumną z automatycznym przyrostem.
Aby dokładniej to zademonstrować, oto co się stanie, jeśli wstawię więcej wierszy.
INSERT INTO Types (Type)
VALUES
( 'Software' ),
( 'Hardcopy' );
SELECT * FROM Types;
Wynik:
TypeId Type DateInserted ---------- ---------- ------------------- 1 Hardware 2020-06-05 00:21:57 2 Software 2020-06-05 00:22:14 3 Hardcopy 2020-06-05 00:22:14
Aby uzyskać więcej informacji na temat autoinkrementacji kolumn, zobacz Jak działa AUTOINCREMENT w SQLite i Jak utworzyć auto-inkrementującą kolumnę w SQLite.
Wyrażenia jako wartość domyślna
Możesz również użyć wyrażenia stałego jako wartości domyślnej. Aby to zrobić, wyrażenie musi być ujęte w nawiasy.
Oto przykład.
CREATE TABLE Person(
PersonId INTEGER PRIMARY KEY,
Name,
Entered DEFAULT (round(julianday('now'))),
Deadline DEFAULT (round(julianday('now')) + 10.5)
);
A teraz trochę danych.
INSERT INTO Person (Name)
VALUES ( 'Fred' );
SELECT * FROM Person;
Wynik:
PersonId Name Entered Deadline ---------- ---------- ---------- ---------- 1 Fred 2459006.0 2459016.5
Zauważ, że wyrażenie musi być wyrażeniem stałym. Wyrażenie stałe to wyrażenie zawierające tylko stałe.
Jeśli spróbujesz użyć wyrażenia, które nie zawiera tylko stałych, otrzymasz błąd.
CREATE TABLE Person(
PersonId INTEGER PRIMARY KEY,
FirstName,
LastName,
UserName DEFAULT (FirstName || LastName)
);
Wynik:
Error: default value of column [UserName] is not constant