Virtuell kolonne

Fra Wikipedia, den frie encyklopedi

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,[1] og er bare implementert av noen databasehåndteringssystemer som MariaDB, Microsoft SQL Server, Oracle, PostgreSQL, SQLite og Firebird (COMPUTED BY-syntaks).

Implementering[rediger | rediger kilde]

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[rediger | rediger kilde]

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

MariaDB[rediger | rediger kilde]

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

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

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:

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[rediger | rediger kilde]

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[rediger | rediger kilde]

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.[4]

Oracle[rediger | rediger kilde]

Siden versjon 11g støtter Oracle virtuelle kolonner.

Microsoft SQL Server[rediger | rediger kilde]

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

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

Firebird[rediger | rediger kilde]

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

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[rediger | rediger kilde]

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[rediger | rediger kilde]

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

SQLite[rediger | rediger kilde]

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

Referanser[rediger | rediger kilde]

Eksterne lenker[rediger | rediger kilde]