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  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:
```mysql
<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:
```sql
column_name [type] COMPUTED BY (expression)
```
eller industristandarden
```sql
column_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](http://msdn.microsoft.com/en-us/library/ms191250(v=sql.105).aspx)