Virtuell kolonne

I relasjonsdatabaser er en virtuell kolonne en tabell-kolonne hvis verdi(er) beregnes automatisk ved hjelp av andre kolonneverdier, eller et annet deterministisk uttrykk. Virtuelle kolonner er definert av SQL:2003 som Generated Column, og er bare implementert av noen databasehåndteringssystemer som MariaDB, Microsoft SQL Server, Oracle, PostgreSQL, SQLite og Firebird (COMPUTED BY-syntaks).

Implementering 
Det er to typer virtuelle kolonner:

 Virtuelle kolonner
 Vedvarende kolonner

Virtuelle kolonner verdier beregnes underveis når det er nødvendig, for eksempel når de returneres av et SELECT-uttrykk. Vedvarende kolonneverdier beregnes når en rad settes inn i en tabell, og de skrives som alle andre verdier. De kan endres hvis andre verdier endres. Både virtuelle og vedvarende kolonner har fordeler og ulemper: Virtuelle kolonner tar ikke opp lagringsplass, men de må beregnes hver gang en spørring refererer til dem. Vedvarende kolonner derimot krever ingen CPU-tid, men bruker lagringsplass. Noen ganger er imidlertid ikke mulig å velge mellom dem fordi noen databasehåndteringssystemer bare støtter én kolonnetype (eller ingen av dem).

IBM Db2 
IBM Db2 støtter virtuelle kolonner fra versjon 8 under navnet generated column.

MariaDB 
MariaDB er en forgrening av MySQL. Virtuelle kolonner ble lagt til i 5.2-treet.

Uttrykk som kan brukes til å beregne de virtuelle kolonnene har følgende begrensninger:

 De må være deterministiske
 De kan ikke returnere konstante verdier
 De kan ikke bruke brukerdefinerte funksjoner eller lagrede prosedyrer.
 De kan ikke inkludere andre virtuelle kolonner.
 De kan ikke bruke subqueries.

Vedvarende kolonner kan indekseres og være en del av en fremmednøkkel, med noen få små begrensninger angående håndhevelse av betingenser.

Virtuelle kolonner kan bare brukes på tabeller som bruker en lagringsmotor som støtter dem. Lagringsmotorer som støtter virtuelle kolonner er:

 InnoDB
 MyISAM
 Arie

MRG_MyISAM-tabeller kan være basert på MyISAM-tabeller som inkluderer vedvarende kolonner, men den tilsvarende MRG_MyISAM-kolonnen bør defineres som en vanlig kolonne.

Syntaks 
Et CREATE TABLE- eller ALTER TABLE-uttrykk kan brukes til å legge til en virtuell kolonne. Syntaksen som brukes til å definere en virtuell kolonne er følgende:<type> [GENERATED ALWAYS] AS  ( <expression> ) [VIRTUAL | PERSISTENT] [UNIQUE] [UNIQUE KEY] [COMMENT <text>]

 type er kolonnens datatype
 uttrykk er SQL-uttrykket som returnerer kolonnens verdi for hver rad
 text er en valgfri kolonnekommentar

MySQL 
Støtte for virtuelle kolonner, kjent i MySQL som genererte kolonner (generated columns), begynte å bli tilgjengelig i MySQL 5.7. Ulike begrensninger i bruken av dem har blitt lempet på i påfølgende versjoner.

Oracle 
Siden versjon 11g støtter Oracle virtuelle kolonner.

Microsoft SQL Server 
Microsoft SQL Server støtter virtuelle kolonner, men kaller de beregnede kolonner (computed columns).

SQL Server støtter både vedvarende og ikke-vedvarende beregnede kolonner.

Firebird 
Firebird har alltid støttet virtuelle kolonner ettersom forløperen InterBase støtter det, og kaller dem beregnede kolonner (computed columns).

Firebird støtter bare virtuelle kolonner, men ikke vedvarende, og åpner for delspørringer (sub-select) ved å kalle innebygde funksjoner, eksterne funksjoner og lagrede prosedyrer i det virtuelle kolonneuttrykket.

Syntaks 
Opprettelse av en virtuell kolonne kan gjøres under tabellopprettelse eller når man legger til kolonner i en eksisterende tabell. Syntaksen som brukes til å definere en virtuell kolonne er følgende:column_name [type] COMPUTED BY (expression)eller industristandardencolumn_name [type] GENERATED ALWAYS AS (expression)

PostgreSQL 
Siden versjon 12 støtter PostgreSQL virtuelle kolonner, kjent som genererte kolonner (generated columns).

SQLite 
Siden versjon 3.31.0 (2020-01-22) støter SQLite virtuelle kolonner, kjent som genererte kolonner.

Referanser

Eksterne lenker 
 Virtual Columns i MariaDB sin dokumentasjon
 MariaDB 5.2: What would you use virtual columns for?  på OpenLife.cc
 Virtual Columns in Oracle Database 11g Release 1
 Computed Columns in SQL Server 2008

Databasehåndteringssystem