Kuidas saab PostgreSQLis ühe lausega lisada tabelisse puuduvad read ja uuendada olemasolevaid ridu?

Postitas Erki Eessaar 24.10.2022 00:06 (muudeti 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.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!