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

Sådan opretter du en beregnet kolonne i SQLite

Genereret kolonneunderstøttelse blev tilføjet til SQLite i version 3.31.0, som blev frigivet den 22. januar 2020.

Genererede kolonner og beregnede kolonner er det samme. De er kolonner, hvis værdier er en funktion af andre kolonner i samme række.

I SQLite oprettes genererede kolonner ved hjælp af GENERATED AWAYS kolonne-begrænsning ved oprettelse eller ændring af tabellen.

Der er to typer genererede kolonner; LAGET og VIRTUEL . Kun VIRTUAL kolonner kan tilføjes, når en tabel ændres. Begge typer kan tilføjes, når du opretter en tabel.

Eksempel

Her er et eksempel til at demonstrere.

CREATE TABLE Products( 
    Id INTEGER PRIMARY KEY, 
    Name TEXT,
    Qty INT,
    Price INT,
    TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);

Hvis du får følgende fejlmeddelelse:

Error: near "AS": syntax error

Chancerne er, at du skal opgradere til en senere version af SQLite. Genererede kolonner blev kun introduceret i SQLite 3.31.0.

Lad os nu indsætte data og vælge dem.

INSERT INTO Products VALUES 
  (1, 'Hammer', 10, 9.99),
  (2, 'Saw', 5, 11.34),
  (3, 'Wrench', 7, 37.00),
  (4, 'Chisel', 9, 23.00),
  (5, 'Bandage', 70, 120.00);

SELECT * FROM Products;

Resultat:

Id     Name        Qty    Price   TotalValue
-----  ----------  -----  ------  ----------
1      Hammer      10     9.99    99.9      
2      Saw         5      11.34   56.7      
3      Wrench      7      37      259       
4      Chisel      9      23      207       
5      Bandage     70     120     8400      

Dette er et simpelt eksempel, og du kan helt sikkert bruge mere komplekse udtryk, for eksempel dem, der bruger indbyggede funktioner.

Virtuelt vs. gemt

Som standard oprettes den beregnede kolonne som en VIRTUEL kolonne.

Du har også mulighed for at oprette en LAGET kolonne.

Værdien af ​​en VIRTUAL kolonne beregnes, når den læses, hvorimod værdien af ​​en STORED kolonnen beregnes, når rækken skrives.

Du kan udtrykkeligt bruge VIRTUAL eller LAGET i din kolonnedefinition for at angive, hvilken det skal være. Hvis du udelader dette, vil det være VIRTUEL .

Sådan kan vi ændre det forrige eksempel til at bruge en STORED kolonne.

CREATE TABLE Products( 
    Id INTEGER PRIMARY KEY, 
    Name TEXT,
    Qty INT,
    Price INT,
    TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);

Uanset om det er en GEMET kolonne eller VIRTUAL , indtastning og valg af data er nøjagtig det samme.

INSERT INTO Products VALUES 
  (1, 'Hammer', 10, 9.99),
  (2, 'Saw', 5, 11.34),
  (3, 'Wrench', 7, 37.00),
  (4, 'Chisel', 9, 23.00),
  (5, 'Bandage', 70, 120.00);

SELECT * FROM Products;

Resultat:

Id     Name        Qty    Price   TotalValue
-----  ----------  -----  ------  ----------
1      Hammer      10     9.99    99.9      
2      Saw         5      11.34   56.7      
3      Wrench      7      37      259       
4      Chisel      9      23      207       
5      Bandage     70     120     8400      

Opdatering af data i en genereret kolonne

Du kan ikke opdatere data direkte i en beregnet kolonne. Det vil sige, at du ikke kan skrive direkte til selve den beregnede kolonne.

For at opdatere dens data skal du opdatere dataene i de underliggende kolonner, der bruges i den beregnede kolonnes udtryk.

Her er et eksempel på opdatering af de data, der blev brugt i de foregående eksempler.

UPDATE Products 
SET Qty = 5 WHERE Id = 1;

SELECT * FROM Products;

Resultat:

Id     Name        Qty    Price   TotalValue
-----  ----------  -----  ------  ----------
1      Hammer      5      9.99    49.95     
2      Saw         5      11.34   56.7      
3      Wrench      7      37      259       
4      Chisel      9      23      207       
5      Bandage     70     120     8400      

I dette tilfælde reducerede jeg antallet af tilgængelige hamre til 5. Dette reducerede igen den samlede værdi af hamre på lager og værdien i den genererede kolonne (TotalValue ) nedsat fra 99,99 til 49,95.


  1. Hierarkisk liste over triggerhændelsestyper i SQL Server 2017

  2. Find referenceenheder i SQL Server:sys.dm_sql_referencing_entities()

  3. Hvordan kan jeg se alle fremmednøgler til en tabel eller kolonne?

  4. NULL kompleksitet – del 1