Quando crei una tabella in SQLite, hai la possibilità di aggiungere vincoli a ciascuna colonna.
Uno di questi vincoli è il DEFAULT
vincolo.
Il DEFAULT
il vincolo consente di specificare un valore da utilizzare nel caso in cui non venga fornito alcun valore per quella colonna quando viene inserita una nuova riga.
Se non usa un DEFAULT
clausola, quindi il valore predefinito per una colonna è NULL
.
Possibili valori predefiniti
Il valore predefinito esplicito di un DEFAULT
il vincolo può essere uno dei seguenti:
- una stringa costante
- una costante blob
- un numero firmato
- qualsiasi espressione costante racchiusa tra parentesi.
CURRENT_TIME
CURRENT_DATE
CURRENT_TIMESTAMP
NULL
Esempio
Ecco un esempio da dimostrare.
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName,
Price DEFAULT 0.00
);
Qui ho aggiunto un DEFAULT
vincolo al Prezzo colonna. In questo caso, il valore predefinito è 0,00 .
Ora quando inserisco una nuova riga senza specificare un valore per il Prezzo colonna, viene utilizzato il valore predefinito.
INSERT INTO Products ( ProductId, ProductName )
VALUES (1, 'Long Weight');
SELECT * FROM Products;
Risultato:
ProductId ProductName Price ---------- ----------- ---------- 1 Long Weight 0.0
Valori espliciti
Naturalmente, il valore predefinito viene utilizzato solo quando non si fornisce un valore in modo esplicito. Se lo fai, viene invece utilizzato quel valore.
Ecco un altro esempio. Questa volta fornisco esplicitamente un valore per quel Prezzo colonna.
INSERT INTO Products ( ProductId, ProductName, Price )
VALUES (2, 'Left-Handed Screwdriver', 19.99);
SELECT * FROM Products;
Risultato:
ProductId ProductName Price ---------- ------------------------- ---------- 1 Long Weight 0.0 2 Left-Handed Screwdriver 19.99
NULL espliciti
L'esempio precedente si applica anche a NULL
esplicitamente fornito valori.
Per dimostrarlo, ecco cosa succede se inserisco esplicitamente NULL
nel Prezzo colonna.
INSERT INTO Products ( ProductId, ProductName, Price )
VALUES (3, 'Elbow Grease', NULL);
SELECT * FROM Products;
Risultato:
ProductId ProductName Price ---------- ------------------------ ---------- 1 Long Weight 0.0 2 Left-Handed Screwdriver 19.99 3 Elbow Grease
Questa volta il Prezzo la colonna è NULL
, perché è quello che ho inserito esplicitamente in quella colonna.
Per evitare che ciò accada, vedere Come convertire i valori NULL nel valore predefinito della colonna durante l'inserimento di dati in SQLite.
Timestamp predefinito
In questo esempio creo un'altra tabella. Questa volta ho impostato il valore predefinito sul timestamp corrente.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type,
DateInserted DEFAULT CURRENT_TIMESTAMP
);
E ora alcuni dati.
INSERT INTO Types (Type)
VALUES ( 'Hardware' );
SELECT * FROM Types;
Risultato:
TypeId Type DateInserted ---------- ---------- ------------------- 1 Hardware 2020-06-05 00:21:57
Il timestamp viene inserito come previsto.
Valore con incremento automatico come valore predefinito
Nota che anche nell'esempio precedente non ho fornito un valore per TypeId colonna, ma ha comunque generato automaticamente un valore predefinito.
In questo caso, il valore predefinito non era dovuto a un DEFAULT
vincolo. Era dovuto al fatto che la colonna è una colonna di chiave primaria creata utilizzando INTEGER PRIMARY KEY
. Quando definisci una colonna usando INTEGER PRIMARY KEY
, la colonna diventa automaticamente una colonna con incremento automatico.
Per dimostrarlo in modo più approfondito, ecco cosa succede se inserisco altre righe.
INSERT INTO Types (Type)
VALUES
( 'Software' ),
( 'Hardcopy' );
SELECT * FROM Types;
Risultato:
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
Per ulteriori informazioni sulle colonne con incremento automatico, vedere Come funziona AUTOINCREMENT in SQLite e Come creare una colonna con incremento automatico in SQLite.
Espressioni come valore predefinito
È inoltre possibile utilizzare un'espressione costante come valore predefinito. Per fare ciò, l'espressione deve essere racchiusa tra parentesi.
Ecco un esempio.
CREATE TABLE Person(
PersonId INTEGER PRIMARY KEY,
Name,
Entered DEFAULT (round(julianday('now'))),
Deadline DEFAULT (round(julianday('now')) + 10.5)
);
E ora alcuni dati.
INSERT INTO Person (Name)
VALUES ( 'Fred' );
SELECT * FROM Person;
Risultato:
PersonId Name Entered Deadline ---------- ---------- ---------- ---------- 1 Fred 2459006.0 2459016.5
Si noti che l'espressione deve essere un'espressione costante. Un'espressione costante è un'espressione che contiene solo costanti.
Se provi a utilizzare un'espressione che non contiene solo costanti, riceverai un errore.
CREATE TABLE Person(
PersonId INTEGER PRIMARY KEY,
FirstName,
LastName,
UserName DEFAULT (FirstName || LastName)
);
Risultato:
Error: default value of column [UserName] is not constant