Vastus (24.10.2022 00:09): Sellist operatsiooni tuntakse ka nime all upsert (kombinatsioon INSERT ja UPDATE operatsiooniks).
Selle realiseerimiseks saab PostgreSQLis kasutada INSERT ... ON CONFLICT lauset. Alates PostgreSQL 15 saab selleks kasutada ka
MERGE lauset, mis võimaldab ühte lausesse kombineerida INSERT, UPDATE ja DELETE lause. Seda lauset kirjeldab ka SQL standard. Oracles on see lause
ammu olemas.
Näiteks, kui ülesandeks on lisada tabelisse
Salary töötajad (tabelist
Emp)
, kes on seal registreerimata ja uuendada (tabeli
Emp põhjal) nende töötajate palku, kes seal on registreeritud, siis kui enne tuli PostgreSQLis kasutada sellist lauset
INSERT INTO Salary (employee_id, sal)
SELECT empno, sal
FROM Emp
ON CONFLICT (employee_id) DO UPDATE
SET sal = EXCLUDED.sal;
, saab tänu MERGE lausele ka nii.
MERGE INTO Salary S
USING Emp E
ON (E.empno=S.employee_id)
WHEN MATCHED THEN UPDATE SET sal = E.sal
WHEN NOT MATCHED THEN INSERT (employee_id, sal)
VALUES (E.empno, E.sal);
PostgreSQLi MERGE lause realisatsiooni probleemiks on, et kui samaaegselt MERGE lausega toimub INSERT lauseid, siis MERGE ei pruugi seda märgata, teeb ka ise INSERT ja tulemuseks unikaalsuse viga. ON CONFLICT kasutamise korral on tagatud, et toimub kas INSERT või UPDATE ja unikaalsuse viga ei teki.