Kodulehed
[383] - Andmebaasid II (ITI0207) (sügis 2022)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid.
Värvilised mummud tähistavad hinnangulist kataloogide lugemise vajadust. Roheline - suurim, kollane - keskmine, punane või mummuta - väikseim
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / PostgreSQL

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Erki Eessaar (24.10.2022 00:02):
Kuidas saab PostgreSQLis ühe lausega lisada tabelisse puuduvad read ja uuendada olemasolevaid ridu?
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.

Hinda vastust:

Keskmine hinne : Pole veel hinnanguid!