ďťż
 
Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL ďťż
 
Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • ptsite.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com