Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL
Sonic - 16-08-2007 00:44
Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL
Szukam możliwości wykonania następującej operacji:
1. Wykonywany jest SELECT na określonym widoku 2. Jeśli nie zostaną znalezione żadne tuple odpowiadające warunkom wyszukiwania, baza dodaje nowy wiersz o podanych parametrach.
Czytałem dokumentację dotyczącą reguł, korzystam z nich w innych przypadkach, ale pojawił się następujący problem - podczas operacj INSERT, UPDATE i DELETE mam do dyspozycji zmienne OLD i NEW przechowujące zmieniane dane. Tych zmiennych jednak nie ma przy regułach dla SELECT.
-- Michał
hubert depesz lubaczewski - 17-08-2007 00:01
Dnia 15.08.2007 Sonic <mpaluchowski@gmail.com> napisał/a: > 1. Wykonywany jest SELECT na określonym widoku > 2. Jeśli nie zostaną znalezione żadne tuple odpowiadające warunkom > wyszukiwania, baza dodaje nowy wiersz o podanych parametrach.
http://www.depesz.com/index.php/2006...cze-go-nie-ma/
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
Sonic - 17-08-2007 00:01
On Aug 16, 7:25 am, hubert depesz lubaczewski <dep...@depesz.com> wrote:
> http://www.depesz.com/index.php/2006...ekordu-gdy-jes...
Sympatyczne rozwiązanie, ale potrzebuję coś, co jeszcze dodatkowo zwróci mi id wiersza istniejącego lub nowo-wstawionego.
-- Michał
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 17-08-2007 00:01
Sonic wrote: > On Aug 16, 7:25 am, hubert depesz lubaczewski <dep...@depesz.com> > wrote: > >> http://www.depesz.com/index.php/2006...ekordu-gdy-jes... > > Sympatyczne rozwiązanie, ale potrzebuję coś, co jeszcze dodatkowo > zwróci mi id wiersza istniejącego lub nowo-wstawionego.
To pozostaje Ci napisać funkcję. Dzięki uważnemu przeczytaniu linka poniżej możesz zaoszczędzić jednego select'a. :)
http://www.postgresql.org/docs/8.2/s...ql-insert.html
-- P.M.
kenubi - 23-08-2007 00:02
hubert depesz lubaczewski wrote:
> http://www.depesz.com/index.php/2006...cze-go-nie-ma/ > > depesz > A co sie stanie? ;)
Klient 1: A Klient 2: B
CREATE TABLE x (pole varchar(15));
A: BEGIN; B: BEGIN; A: INSERT INTO x SELECT 'xxx' WHERE NOT EXISTS(SELECT * FROM x WHERE pole='xxx'); ->INSERT 0 1 B: INSERT INTO x SELECT 'xxx' WHERE NOT EXISTS(SELECT * FROM x WHERE pole='xxx'); ->INSERT 0 1 A: COMMIT; ->COMMIT B: COMMIT; ->COMMIT
SELECT * FROM x; pole ------- xxx xxx
No coz, dodajmy index UNIQUE na "pole" :P
Mysle, ze pisanie o tym "bezpieczne" jest co najmniej nie wskazane.
pozdrawiam
hubert depesz lubaczewski - 23-08-2007 00:02
Dnia 22.08.2007 kenubi <reklamy@a.migrol.pl> napisał/a: > No coz, dodajmy index UNIQUE na "pole" :P > Mysle, ze pisanie o tym "bezpieczne" jest co najmniej nie wskazane.
to bezpiecznie tyczyło się tego, że takie zapytanie nie wywali ci długiej transakcji gdy już tam jest rekord i klucz unique.
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
kenubi - 23-08-2007 00:02
hubert depesz lubaczewski wrote:
> Dnia 22.08.2007 kenubi <reklamy@a.migrol.pl> napisał/a: >> No coz, dodajmy index UNIQUE na "pole" :P >> Mysle, ze pisanie o tym "bezpieczne" jest co najmniej nie wskazane. > > to bezpiecznie tyczyło się tego, że takie zapytanie nie wywali ci > długiej transakcji gdy już tam jest rekord i klucz unique. > > depesz > to trzeba dopisac do tekstu uwagi Po przeczytaniu tego mialem nieodparte wrazenie, ze chodzi tam o cos innego typu - zloty środek jak wstawic wiersz bez wywalenia bledu (szczegolnie fragment BEGIN;INSERT;COMMIT;) a zreszta co ma rozwiazac drugi kod jezeli jest prawie jednoznaczny z BEGIN;NOT EXISTS?->INSERT;COMMIT ? - tu wywala i tu wywala(troche pozniej) tylko w drugim przypadku bardziej nadaje sie do pracy jednostanowiskowej (mniej kodu?)
>"..gdy juz tam jest rekord.." No wlasnie skad wiadomo, ze on tam jest?(bez blokad) O to mi sie rozbija.
No to wezmy teraz sprawe od dupy (sorry) strony:
SELECT * FROM x; pole ----- xxx xxx
A: BEGIN; B: BEGIN; A: DELETE FROM x WHERE pole='xxx'; ->DELETE 2 B: INSERT INTO x SELECT 'xxx' WHERE NOT EXISTS(SELECT * FROM x WHERE pole='xxx') -> INSERT 0 0 A: COMMIT; B: COMMIT;
SELECT * FROM x; pole ------ (0) rows
Co teraz? Transakcja sie nie wywalila ale .. nic nie mamy w tabeli a spodziewamy sie ze "TO" tam jest!
Zmiany,zmiany,zmiany ...:)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
[PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?=
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?=
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
=?ISO-8859-2?Q?[psql]_Polskie_t=B3umaczenie_?= =?ISO-8859-2?Q?licencji_BSD_dla_PostgreSQL=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plptsite.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|