SQLite
 sql >> Database >  >> RDS >> SQLite

Impostare un valore predefinito per una colonna in SQLite:vincolo DEFAULT

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