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 industristandarden

```
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
----------

1. ↑  SQL:2003 Has Been Published
2. ↑  SQL Reference Volume 2 Version 8[*død lenke*]
3. ↑  Virtual Columns
4. ↑  «MySQL :: MySQL 5.7 Reference Manual :: 13.1.18.7 CREATE TABLE and Generated Columns».
5. ↑  «Korriger: DBCC CHECKDB returnerer feil konsekvens Hvis SOUNDEX-funksjonen brukes i PERSISTED beregnede kolonner i SQL Server - Støtte for Microsoft». *support.microsoft.com*. Besøkt 20. mai 2023.
6. ↑  «Computed Columns».
7. ↑  «TABLE».
8. ↑  «5.3. Generated Columns».
9. ↑  «Generated Columns».

Eksterne lenker
---------------

* Virtual Columns i MariaDB sin dokumentasjon
* MariaDB 5.2: What would you use virtual columns for? Arkivert 7. april 2022 hos Wayback Machine. på OpenLife.cc
* Virtual Columns in Oracle Database 11g Release 1
* Computed Columns in SQL Server 2008

| * v
* d
* r
SQL |
| --- |
| Versjoner | 
* SEQUEL
* SQL-86
* SQL-89
* SQL-92
* SQL:1999
* SQL:2003
* SQL:2006
* SQL:2008
* SQL:2011
* SQL:2016

 |
| Nøkkelord | 
* As
* Case
* Create
* Delete
* Drop
* From
* Group by
* Having
* Insert
* Join
* Merge
* Null
* Order by
* Over
* Prepare
* Select
* Truncate
* Mengdeoperasjoner
* Union
* Update
* Where
* With

 |
| Relatert | 
* Edgar Codd
* Relasjonsdatabase
* Betingelse
* Utløser
* Resultatmengde
* Tabell
	+ Brukerdefinert funksjon
	+ Delspørring
		- Korrelert
	+ Felles tabelluttrykk
	+ Lagret prosedyre
	+ Visning

* Wikibook SQL

 |
| ISO/IEC SQL-deler | 
* Rammeverk
* Grunnlag
* Kallnivå-grensesnitt
* Vedvarende lagrede moduler
* Håndtering av eksterne data
* Objektspråk-bindinger
* Informasjons- og definisjonsskjemaer
* SQL-rutiner og typer for programmeringsspråket Java
* XML-relaterte spesifikasjoner

 |