Thanks, that's perfect. -kenneth On Tue, Nov 22, 2011 at 12:53 PM, Merlin Moncure <mmoncure@xxxxxxxxx> wrote: > On Tue, Nov 22, 2011 at 11:25 AM, Kenneth Tilton <ktilton@xxxxxxxx> wrote: >> Bit of a trigger NOOB Q: >> >> I am trying to use a trigger function to automatically populate new >> rows in a table with a public ID of the form YYYY-NNN such that the >> 42nd row created in 2011 would get the ID "2011-042". Each row is >> associated via an iasid column with a row in an audit table that has a >> timestamp column called created. This works OK, but I am worried about >> two rows getting the same case_no if they come in at the same time >> (whatever that means): >> >> declare >> case_yr integer; >> yr_case_count bigint; >> begin >> select date_part('year', created) into case_yr >> from audit >> where audit.sid = NEW.iasid; >> >> select count(*) into yr_case_count >> from fwa_case, audit >> where fwa_case.iasid=audit.sid >> and date_part('year', created) = case_yr; >> >> NEW.case_no = to_char( case_yr, '9999' ) || '-' || >> to_char(1+yr_case_count, 'FM000'); >> return NEW; >> end; >> >> Do I have to worry about this, or does ACID bail me out? If the >> former, what do I do? I am thinking first put a uniqueness constraint >> on the column and then figure out how to do retries in a trigger >> function. > > ACID does not bail you out -- you've put no synchonization in to > prevent to concurrent counts coming at roughly the same time and > getting the same answer. A uniqueness constraint is definitely a good > idea. In terms of doing a gapless sequence generally, see here: > http://www.varlena.com/GeneralBits/130.php. Basically the general > idea is to keep a counter field somewhere that you lock and update. > > merlin > -- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general