Při vytváření tabulky v SQLite máte možnost přidat omezení do každého sloupce.
Jedním z takových omezení je DEFAULT
omezení.
DEFAULT
omezení umožňuje zadat hodnotu, která se má použít v případě, že pro daný sloupec není při vložení nového řádku zadána žádná hodnota.
Pokud neděláte použijte DEFAULT
klauzule, pak je výchozí hodnota pro sloupec NULL
.
Možné výchozí hodnoty
Explicitní výchozí hodnota DEFAULT
omezení může být kterékoli z následujících:
- řetězcová konstanta
- konstanta blob
- číslo se znaménkem
- jakýkoli konstantní výraz uzavřený v závorkách.
CURRENT_TIME
CURRENT_DATE
CURRENT_TIMESTAMP
NULL
Příklad
Zde je příklad k demonstraci.
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName,
Price DEFAULT 0.00
);
Zde jsem přidal DEFAULT
omezení na Cenu sloupec. V tomto případě je výchozí hodnota 0,00 .
Nyní, když vložím nový řádek bez zadání hodnoty pro Cena sloupec, použije se výchozí hodnota.
INSERT INTO Products ( ProductId, ProductName )
VALUES (1, 'Long Weight');
SELECT * FROM Products;
Výsledek:
ProductId ProductName Price ---------- ----------- ---------- 1 Long Weight 0.0
Explicitní hodnoty
Výchozí hodnota se samozřejmě použije pouze v případě, že hodnotu explicitně nezadáte. Pokud tak učiníte, použije se místo toho tato hodnota.
Zde je další příklad. Tentokrát výslovně uvádím hodnotu této Ceny sloupec.
INSERT INTO Products ( ProductId, ProductName, Price )
VALUES (2, 'Left-Handed Screwdriver', 19.99);
SELECT * FROM Products;
Výsledek:
ProductId ProductName Price ---------- ------------------------- ---------- 1 Long Weight 0.0 2 Left-Handed Screwdriver 19.99
Explicitní hodnoty NULL
Předchozí příklad platí také pro explicitně poskytnuté NULL
hodnoty.
Abychom to demonstrovali, zde je to, co se stane, když výslovně vložím NULL
do Ceny sloupec.
INSERT INTO Products ( ProductId, ProductName, Price )
VALUES (3, 'Elbow Grease', NULL);
SELECT * FROM Products;
Výsledek:
ProductId ProductName Price ---------- ------------------------ ---------- 1 Long Weight 0.0 2 Left-Handed Screwdriver 19.99 3 Elbow Grease
Tentokrát Cena sloupec je NULL
, protože to je to, co jsem výslovně vložil do tohoto sloupce.
Chcete-li tomu zabránit, přečtěte si článek Jak převést hodnoty NULL na výchozí hodnotu sloupce při vkládání dat do SQLite.
Výchozí časové razítko
V tomto příkladu vytvořím další tabulku. Tentokrát jsem nastavil výchozí hodnotu na aktuální časové razítko.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type,
DateInserted DEFAULT CURRENT_TIMESTAMP
);
A teď pár údajů.
INSERT INTO Types (Type)
VALUES ( 'Hardware' );
SELECT * FROM Types;
Výsledek:
TypeId Type DateInserted ---------- ---------- ------------------- 1 Hardware 2020-06-05 00:21:57
Časové razítko je vloženo podle očekávání.
Automaticky se zvyšující hodnota jako výchozí hodnota
Všimněte si, že v předchozím příkladu jsem také nezadal hodnotu pro TypeId sloupec, ale stejně automaticky vygeneroval výchozí hodnotu.
V tomto případě výchozí hodnota nebyla způsobena DEFAULT
omezení. Bylo to kvůli skutečnosti, že sloupec je sloupec primárního klíče, který byl vytvořen pomocí INTEGER PRIMARY KEY
. Když definujete sloupec pomocí INTEGER PRIMARY KEY
, sloupec se automaticky stane sloupcem s automatickým přírůstkem.
Abychom to důkladněji demonstrovali, zde je to, co se stane, když vložím další řádky.
INSERT INTO Types (Type)
VALUES
( 'Software' ),
( 'Hardcopy' );
SELECT * FROM Types;
Výsledek:
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
Další informace o sloupcích s automatickým přírůstkem najdete v tématu Jak funguje AUTOINCREMENT v SQLite a Jak vytvořit sloupec s automatickým přírůstkem v SQLite.
Výrazy jako výchozí hodnota
Jako výchozí hodnotu můžete také použít konstantní výraz. K tomu musí být výraz uzavřen v závorkách.
Zde je příklad.
CREATE TABLE Person(
PersonId INTEGER PRIMARY KEY,
Name,
Entered DEFAULT (round(julianday('now'))),
Deadline DEFAULT (round(julianday('now')) + 10.5)
);
A teď pár údajů.
INSERT INTO Person (Name)
VALUES ( 'Fred' );
SELECT * FROM Person;
Výsledek:
PersonId Name Entered Deadline ---------- ---------- ---------- ---------- 1 Fred 2459006.0 2459016.5
Všimněte si, že výraz musí být konstantní výraz. Konstantní výraz je výraz, který obsahuje pouze konstanty.
Pokud se pokusíte použít výraz, který neobsahuje pouze konstanty, dostanete chybu.
CREATE TABLE Person(
PersonId INTEGER PRIMARY KEY,
FirstName,
LastName,
UserName DEFAULT (FirstName || LastName)
);
Výsledek:
Error: default value of column [UserName] is not constant