Berechnete Spalten sind Spalten, deren Werte automatisch auf der Grundlage anderer Spalten in der Tabelle erstellt werden. Das Konzept wurde entwickelt, um den Zugriff auf Ergebnisse typischer Berechnungen zu vereinfachen, um Formeln nicht in jeder Abfrage wiederholen zu müssen. Sie können als virtuelle (Werte werden bei jeder Abfrage berechnet) oder persistente (werdend physisch gespeichert bei Datenaktualisierungen) deklariert werden.
Das Problem besteht darin, dass nicht alle Ausdrücke auf Tabellenebene berechnet werden können (Einschränkungen durch Art der Funktionen), und die physische Speicherung von abgeleiteten Daten benötigt Platz und erfordert die Aufrechterhaltung der Aktualität bei UPDATE.
Lösung: Deklarieren Sie berechnete Spalten auf DDL-Ebene, wenn möglich, oder implementieren Sie die Aktualisierungslogik über Trigger/Prozeduren, wenn Speicherung erforderlich ist, oder verwenden Sie Aggregate.
Beispielcode (MS SQL Server):
ALTER TABLE orders ADD total_sum AS (quantity * price); -- virtuell ALTER TABLE orders ADD total_sum_persisted AS (quantity * price) PERSISTED; -- dauerhaft
Wichtige Merkmale:
Kann man einen Index auf eine berechnete Spalte erstellen?
Wenn die Spalte als PERSISTED (physisch gespeichert) deklariert ist, kann ein Index erstellt werden. Für virtuelle gilt das nicht immer, es hängt von der DBMS ab.
CREATE INDEX ix_total_sum ON orders (total_sum_persisted);
Werden berechnete Spalten automatisch aktualisiert, wenn sich die Ausgangsspalten ändern?
Ja, bei Einfügen/Bearbeiten der ursprünglichen Daten wird der neue Wert automatisch berechnet, wenn die Spalte auf Tabellenebene als berechnet deklariert ist.
Was passiert, wenn die berechnete Spalte auf NULL verweist?
Die meisten DBMS geben NULL zurück, wenn mindestens ein Operanden NULL ist – stellen Sie sicher, dass Sie mögliche NULL-Werte mit COALESCE/ISNULL behandeln.
ALTER TABLE orders ADD total_with_discount AS (COALESCE(quantity * price, 0));
In der Datenbank werden Betrag und Preis als separate Felder sowie der total gespeichert. Bei der Aktualisierung des Produkts vergisst man, den total zu aktualisieren.
Vorteile:
Nachteile:
Der endgültige Betrag wird als virtuelle Spalte deklariert. Immer genau, weicht nicht von den Ausgangswerten ab.
Vorteile:
Nachteile: