sql >> Databasteknik >  >> RDS >> SQLite

Vad är en genererad kolumn?

Vissa databashanteringssystem (DBMS) inkluderar en funktion som kallas genererade kolumner.

Även kända som "beräknade kolumner", genererade kolumner liknar en normal kolumn, förutom att en genererad kolumns värde härrör från ett uttryck som beräknar värden från andra kolumner.

Med andra ord, en genererad kolumns värde beräknas från andra kolumner.

Exempel

Här är ett grundläggande exempel för att visa hur genererade kolumner fungerar.

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

Det här exemplet skapades i SQLite och använder SQLite-syntaxen för att skapa en genererad kolumn. Den här syntaxen använder GENERATED ALWAYS kolumn-begränsning.

GENERATED ALWAYS delen är valfri i SQLite, så du kan bara använda AS .

Faktiskt, GENERATED ALWAYS delen är också valfri i MySQL, och den är inte ens definierad i TSQL (SQL-tillägget för SQL Server), så AS nyckelord är allt du behöver (tillsammans med det faktiska uttrycket).

Uttrycket är det som bestämmer det faktiska värdet som kolumnen kommer att hålla. I mitt exempel, delen som lyder (Qty * Price) är uttrycket som bestämmer det värdet.

I det här fallet multiplicerar det helt enkelt kvantiteten (antal för varje produkt) med priset för varje produkt.

Därför innehåller denna genererade kolumn det totala värdet av varje lager i inventeringen.

Om vi ​​infogar data och väljer den kan vi se det beräknade värdet för den genererade kolumnen.

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      

Om vi ​​tittar på första raden kan vi se att det finns 10 hammare till ett pris av 9,99 styck. Den genererade kolumnen multiplicerar dessa två värden tillsammans och vi slutar med 99,9.

Om vi ​​minskar antalet hammare, skulle den genererade kolumnen producera ett annat värde.

Här är ett exempel.

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 det här fallet minskade jag antalet hammare till 5, och den genererade kolumnen beräknade därför ett värde på 49,95.

Typer av genererade kolumner

Det finns två typer av genererade kolumner; lagrade och virtuella.

Vissa DBMS kan använda något annorlunda terminologi, till exempel använder SQL Server termen "beständig" istället för "lagrad". Hur som helst, det syftar på samma sak.

  • VIRTUAL :Kolumnvärden lagras inte, utan utvärderas när rader läses.
  • STORED :Kolumnvärden utvärderas och lagras när rader infogas eller uppdateras.

STORED kolumner kräver därför lagringsutrymme, medan VIRTUAL kolumner gör det inte.

Men detta betyder också att VIRTUAL kolumner använder fler CPU-cykler när de läses.

Fördelar med genererade kolumner

Genererade kolumner kan spara tid när du skriver frågor, minska antalet fel och förbättra prestandan.

Genererade kolumner kan användas som ett sätt att förenkla och förena frågor. Ett komplext villkor kan definieras som en genererad kolumn och sedan refereras till från flera frågor i tabellen. Detta hjälper till att säkerställa att de alla använder exakt samma skick.

Lagrade genererade kolumner kan användas som en materialiserad cache för komplicerade förhållanden som är kostsamma att beräkna i farten.

Begränsningar för genererade kolumner

Genererade kolumner har vanligtvis begränsningar jämfört med vanliga kolumner, även om omfattningen av begränsningarna kan bestämmas av DBMS.

Till exempel kan genererade kolumner i allmänhet bara beräkna värden från kolumner inom samma rad. Denna begränsning kan dock övervinnas (åtminstone i SQL Server) genom att använda en användardefinierad funktion som en del av den beräknade kolumns uttryck.

Se länkarna nedan för att läsa mer om implementeringen av genererade kolumner i olika DBMS.

Officiell dokumentation

Här är dokumentationen för några populära DBMS som inkluderar begränsningarna för deras implementering av genererade kolumner:

  • Räknade kolumner i SQL Server
  • Genererade kolumner i PostgreSQL (version 12)
  • Genererade kolumner i MySQL (version 8.0)
  • Genererade kolumner i SQLite


  1. Allt du behöver veta om SQL CTE på ett ställe

  2. Pandas:Hur man läser och skriver filer

  3. Använda olika MySQL-lagringsmotorer i databasdesign

  4. Använda PostgreSQL logisk replikering för att upprätthålla en alltid uppdaterad läs-/skriv-TEST-server