In SQL ciò che vuoi può essere realizzato con le viste o con i trigger.
Supponiamo tu abbia una tabella:
Prodotto|Costo|Guadagno, dove Prodotto è chiave primaria (è un esempio)
e vuoi avere anche il campo Ricavo = Costo + Guadagno
La prima possibilità è:
creare una tabella Prodotti(Prodotto,Costo,Guadagno)
definire una vista VistaProdotti(Prodotto,Costo,Guadagno,Ricavo) come
CREATE VIEW VistaProdotti AS
SELECT Prodotto, Costo, Guadagno, Costo + Guadagno AS Ricavo
FROM Prodotti
tale vista NON sarebbe scrivibile.
La seconda possibilità è:
Definire la tabella Prodotti(Prodotto,Costo,Guadagno,Ricavo), con CHECK (Ricavo = Costo + Guadagno).
Scrivere trigger che controllano gli aggiornamenti e gli inserimenti nella tabella:
CREATE TRIGGER InserisciProdotto BEFORE INSERT ON Prodotti
FOR EACH ROW
BEGIN
IF Ricavo <> Costo + Guadagno THEN
SET Ricavo = Guadagno + Costo
END IF
END
CREATE TRIGGER AggiornaProdotto BEFORE UPDATE ON Prodotti
FOR EACH ROW
BEGIN
IF NEW.Ricavo <> NEW.Costo + NEW.Guadagno THEN
SET NEW.Ricavo = NEW.Costo + NEW.Guadagno
END IF
END
Questo secondo sistema è più complesso, ma permette di operare direttamente sulla tabella e di definire comportamenti più articolati (per esempio, si può far sì che il terzo campo venga calcolato in automatico inserendo solo i primi due).
La scelta del metodo dipende dal tempo che hai, dalle necessità e dalle possibilità offerte dai database (ad esempio, mysql non supporta le clausole check).