Insert of update
Uit Yapf
Het komt regelmatig voor dat je bij het opslaan van gegevens in een database moet beslissen of je een nieuw record moet maken, of een bestaand record moet updaten. Dit resulteert meestal in een of andere routine in PHP die die controle gaat uitvoeren.
Met PostgreSQL's Rules systeem kan dat automatisch in de database.
Een RULE kan een query herschrijven op basis van een gegeven. Dat gegeven kan een SQL statement zijn en omdat je in een RULE werkt kan dat statement data gebruiken van het record dat je probeert aan te maken. Via de EXISTS kun je controleren of een record bestaat, dus alles tesamen betekent dat dat je aan de RULE een voorwaarde kunt geven die luidt: als het record dat je hebt opgekregen al bestaat, dan...
In het volgende voorbeeld controleert EXISTS of het record dat is opgegeven al bestaat. Zoja, dan wordt de query herschreven naar een UPDATE query.
CREATE TABLE test (id INT, name CHAR(10), aantal INT);
CREATE OR REPLACE RULE rule_insert
ASON INSERT TO test
WHEREEXISTS (SELECT
1FROMtest
WHEREname=NEW.name
)DO INSTEAD
UPDATEtest
SETaantal = aantal+1
WHEREname=NEW.name;
INSERT INTO test (id, name, aantal) VALUES (1,'kees', 1);
SELECT * FROM test;
id | name | aantal
----+------------+--------1 | kees | 2
(1 row)
Het enige nadeel van dit voorbeeld is dat je in de functie moet opgeven welke kolommen voor de update in aanmerking komen. Wat je niet invult wordt ook niet geupdate. Als je flexibeler wilt zijn dan zul je een routine in moeten bouwen die zelf uitvist welke kolommen er geupdate moeten worden.