sql >> Database >  >> RDS >> SQLite

Wat is een gegenereerde kolom?

Sommige databasebeheersystemen (DBMS'en) bevatten een functie die gegenereerde kolommen wordt genoemd.

Ook bekend als "berekende kolommen", zijn gegenereerde kolommen vergelijkbaar met een normale kolom, behalve dat de waarde van een gegenereerde kolom is afgeleid van een expressie die waarden uit andere kolommen berekent.

Met andere woorden, de waarde van een gegenereerde kolom wordt berekend op basis van andere kolommen.

Voorbeeld

Hier is een eenvoudig voorbeeld om te demonstreren hoe gegenereerde kolommen werken.

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

Dit voorbeeld is gemaakt in SQLite en gebruikt de SQLite-syntaxis voor het maken van een gegenereerde kolom. Deze syntaxis gebruikt de GENERATED ALWAYS kolombeperking.

De GENERATED ALWAYS deel is optioneel in SQLite, dus je zou gewoon AS . kunnen gebruiken .

Eigenlijk is de GENERATED ALWAYS deel is ook optioneel in MySQL, en het is zelfs niet gedefinieerd in TSQL (de SQL-extensie voor SQL Server), dus de AS zoekwoord is alles wat je nodig hebt (samen met de eigenlijke uitdrukking).

De expressie bepaalt de werkelijke waarde die de kolom zal bevatten. In mijn voorbeeld, het deel dat leest (Qty * Price) is de uitdrukking die die waarde bepaalt.

In dit geval vermenigvuldigt u eenvoudig de hoeveelheid (aantal van elk product) met de prijs van elk product.

Daarom bevat deze gegenereerde kolom de totale waarde van elke voorraad in de inventaris.

Als we gegevens invoegen en selecteren, kunnen we de berekende waarde van de gegenereerde kolom zien.

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;

Resultaat:

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      

Als we naar de eerste rij kijken, zien we dat er 10 hamers zijn voor een prijs van 9,99 per stuk. De gegenereerde kolom vermenigvuldigt deze twee waarden met elkaar en we eindigen met 99,9.

Als we het aantal hamers verminderen, zou de gegenereerde kolom een ​​andere waarde opleveren.

Hier is een voorbeeld.

UPDATE Products 
SET Qty = 5 WHERE Id = 1;

SELECT * FROM Products;

Resultaat:

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      

In dit geval heb ik het aantal hamers teruggebracht tot 5, en de gegenereerde kolom berekende daarom een ​​waarde van 49,95.

Typen gegenereerde kolommen

Er zijn twee soorten gegenereerde kolommen; opgeslagen en virtueel.

Sommige DBMS'en gebruiken mogelijk een iets andere terminologie, bijvoorbeeld SQL Server gebruikt de term "persistent" in plaats van "opgeslagen". Hoe dan ook, het verwijst naar hetzelfde.

  • VIRTUAL :Kolomwaarden worden niet opgeslagen, maar worden geëvalueerd wanneer rijen worden gelezen.
  • STORED :Kolomwaarden worden geëvalueerd en opgeslagen wanneer rijen worden ingevoegd of bijgewerkt.

STORED kolommen vereisen daarom opslagruimte, terwijl VIRTUAL kolommen niet.

Dit betekent echter ook dat VIRTUAL kolommen gebruiken meer CPU-cycli bij het lezen.

Voordelen van gegenereerde kolommen

Gegenereerde kolommen kunnen tijd besparen bij het schrijven van query's, fouten verminderen en de prestaties verbeteren.

Gegenereerde kolommen kunnen worden gebruikt om query's te vereenvoudigen en te verenigen. Een complexe voorwaarde kan worden gedefinieerd als een gegenereerde kolom waarnaar vervolgens wordt verwezen vanuit meerdere query's in de tabel. Dit helpt ervoor te zorgen dat ze allemaal precies dezelfde conditie gebruiken.

Opgeslagen gegenereerde kolommen kunnen worden gebruikt als een gematerialiseerde cache voor gecompliceerde omstandigheden die kostbaar zijn om on-the-fly te berekenen.

Beperkingen van gegenereerde kolommen

Gegenereerde kolommen hebben over het algemeen beperkingen in vergelijking met normale kolommen, hoewel de omvang van de beperkingen kan worden bepaald door het DBMS.

Gegenereerde kolommen kunnen bijvoorbeeld over het algemeen alleen waarden berekenen uit kolommen binnen dezelfde rij. Deze beperking kan echter worden overwonnen (tenminste in SQL Server) door een door de gebruiker gedefinieerde functie te gebruiken als onderdeel van de uitdrukking van de berekende kolom.

Zie de onderstaande links om meer te lezen over de implementatie van gegenereerde kolommen in verschillende DBMS'en.

Officiële documentatie

Hier is de documentatie voor enkele populaire DBMS'en die de beperkingen bevat van hun implementatie van gegenereerde kolommen:

  • Berekende kolommen in SQL Server
  • Gegenereerde kolommen in PostgreSQL (versie 12)
  • Gegenereerde kolommen in MySQL (versie 8.0)
  • Gegenereerde kolommen in SQLite


  1. Inzicht in de resultaten van Execute Explain Plan in Oracle SQL Developer

  2. basic pyodbc bulk insert

  3. SQL Server 2008- Tabelbeperkingen ophalen

  4. Emoji-tekens opslaan in MySQL-database