Har du testat Postgres icke-standardiserade UPDATE .. FROM
klausul? Jag antar att det här skulle fungera
update mytable
set a = first_part(gen.id),
b = second_part(gen.id),
c = third_path(gen.id)
from (
select genid() as genid, id
from mytable
where package_id = 10
) gen
where mytable.id = gen.id;
--and package_id = 10 -- This predicate is no longer necessary as the subquery
-- already filters on package_id, as Erwin mentioned
Observera att jag tvingar genid()
anropas exakt en gång per post i mytable
inom undervalet. Sedan går jag själv med i mytable
och gen
med ett hypotetiskt id
kolumn. Se dokumentationen här:
http://www.postgresql.org/docs/current/interactive /sql-update.html
Det här verkar dock bara ha introducerats med Postgres 9.0. Om det verkar för komplicerat (dvs inte särskilt läsbart) kan du fortfarande ta till pgplsql som användare Florin föreslås här
.