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

Hvad er en genereret kolonne?

Nogle databasestyringssystemer (DBMS'er) indeholder en funktion kaldet genererede kolonner.

Også kendt som "beregnede kolonner", genererede kolonner ligner en normal kolonne, bortset fra at en genereret kolonnes værdi er afledt af et udtryk, der beregner værdier fra andre kolonner.

Med andre ord, en genereret kolonnes værdi beregnes ud fra andre kolonner.

Eksempel

Her er et grundlæggende eksempel for at demonstrere, hvordan genererede kolonner fungerer.

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

Dette eksempel blev oprettet i SQLite og bruger SQLite-syntaksen til at oprette en genereret kolonne. Denne syntaks bruger GENERATED ALWAYS kolonne-begrænsning.

GENERATED ALWAYS del er valgfri i SQLite, så du kan bare bruge AS .

Faktisk er GENERATED ALWAYS del er også valgfri i MySQL, og den er ikke engang defineret i TSQL (SQL-udvidelsen til SQL Server), så AS søgeord er alt hvad du behøver (sammen med det faktiske udtryk).

Udtrykket er det, der bestemmer den faktiske værdi, som kolonnen vil indeholde. I mit eksempel er den del, der lyder (Qty * Price) er det udtryk, der bestemmer denne værdi.

I dette tilfælde multiplicerer det blot mængden (antal på hvert produkt) med prisen på hvert produkt.

Derfor indeholder denne genererede kolonne den samlede værdi af hver bestand i beholdningen.

Hvis vi indsætter data og vælger dem, kan vi se den beregnede værdi af den genererede kolonne.

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      

Hvis vi ser på første række, kan vi se, at der er 10 hamre til en pris af 9,99 pr. Den genererede kolonne multiplicerer disse to værdier sammen, og vi ender med 99,9.

Hvis vi reducerer antallet af hamre, vil den genererede kolonne producere en anden værdi.

Her er et eksempel.

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 hamre til 5, og den genererede kolonne beregnede derfor en værdi på 49,95.

Typer af genererede kolonner

Der er to typer genererede kolonner; lagret og virtuelt.

Nogle DBMS'er kan bruge lidt anderledes terminologi, for eksempel bruger SQL Server udtrykket "vedvarende" i stedet for "lagret". Uanset hvad, henviser det til det samme.

  • VIRTUAL :Kolonneværdier gemmes ikke, men evalueres, når rækker læses.
  • STORED :Kolonneværdier evalueres og gemmes, når rækker indsættes eller opdateres.

STORED kolonner kræver derfor lagerplads, hvorimod VIRTUAL kolonner ikke.

Dette betyder dog også, at VIRTUAL kolonner bruger flere CPU-cyklusser, når de læses.

Fordele ved genererede kolonner

Genererede kolonner kan spare tid, når du skriver forespørgsler, reducere fejl og forbedre ydeevnen.

Genererede kolonner kan bruges som en måde at forenkle og forene forespørgsler. En kompleks betingelse kan defineres som en genereret kolonne og derefter henvises til fra flere forespørgsler i tabellen. Dette er med til at sikre, at de alle bruger nøjagtig den samme tilstand.

Lagrede genererede kolonner kan bruges som en materialiseret cache til komplicerede forhold, der er dyre at beregne på et øjeblik.

Begrænsninger for genererede kolonner

Genererede kolonner har generelt begrænsninger sammenlignet med normale kolonner, selvom omfanget af begrænsningerne kan bestemmes af DBMS.

For eksempel er genererede kolonner generelt kun i stand til at beregne værdier fra kolonner i samme række. Denne begrænsning kan dog overvindes (i hvert fald i SQL Server) ved at bruge en brugerdefineret funktion som en del af den beregnede kolonnes udtryk.

Se nedenstående links for at læse mere om implementeringen af ​​genererede kolonner i forskellige DBMS'er.

Officiel dokumentation

Her er dokumentationen for nogle populære DBMS'er, der inkluderer begrænsningerne for deres implementering af genererede kolonner:

  • Beregnet kolonner i SQL Server
  • Genererede kolonner i PostgreSQL (version 12)
  • Genererede kolonner i MySQL (version 8.0)
  • Genereret kolonner i SQLite


  1. Understøtter SQLDeveloper eksekvering af scripts?

  2. Sammenligning af store og små bogstaver i SQL

  3. En guide til databaseautomatisering med Severalnines ClusterControl

  4. Konverter alle poster i postgres til titelbogstav, første bogstav stort