counter v insert into ... select

Honza Pazdziora adelton na fi.muni.cz
Čtvrtek Duben 21 17:48:39 CEST 2005


On Thu, Apr 21, 2005 at 05:32:39PM +0200, Ondrej Koala Vacha wrote:
> 
> vkladam data do tabulky pomoci insert into ... select a je treba, aby 
> kazde takove vkladani vytvorilo souvislou ciselnou radu od 1. Priklad:

Delate cisla dokladu? Asi pred rokem tady kolem toho bezela celkem
dlouha diskuse.

[...]

> Otazka je, jak takove posloupnosti dosahnout. Zatim to mam u mysql resene 
> vnitrni promennou, tedy:
> 
> insert into X select ...,1, (@sqlist_row:=@sqlist_row+1) from Y where ...
> 
> Mate nekdo napad, jak to vyresit obecne, nebo aspon jak to vyresit v 
> postgresql? 

Budto se spolehnete na to, ze v danem okamziku pobezi takovy select
jenom jeden, v takovem pripade muzete pouzit sekvenci bez cache, ze
ktere prectete jedno cislo, a nasledne budete delat

	insert into X
	select 1, nextval('ta_sekvence') - to_cislo, ...
	from Y
	where ...

Nebo si nad X napisete trigger, ktery vzdy najde max(X.b) pro danou
hodnotu X.a a nastavi new.b := to_maximum + 1. Ovsem mam pocit, ze
PostgreSQL je v procesu zmeny semantiky triggeru zvlaste v pripade
takto mutujicich tabulek, takze to nemusi byt dlouhodobe reseni.

Nebo si udelate vedle pomocnou tabulku seq (id integer not null),
pred zapocetim prace udelate update seq set id = 1 a v tom triggeru
budete delat

	select id into new.b from seq;
	update seq set id = id + 1;

coz ma ale neprijemnou vlastnost, ze muze bezet jenom jeden takovy
insert v jednom okamziku. Coz by se dalo obejit tak, ze by ta seq
mela jeste jeden sloupec na id tohoto behu.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 .project: Perl, mod_perl, DBI, Oracle, large Web systems, XML/XSL, ...
		Only self-confident people can be simple.


Další informace o konferenci Test