From: | Michael Fork <mfork(at)toledolink(dot)com> |
---|---|
To: | postgresql <pgsql(at)symcom(dot)com> |
Cc: | Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>, PgSQL-SQL <pgsql-sql(at)postgresql(dot)org> |
Subject: | Re: serial type; race conditions |
Date: | 2001-03-29 15:04:46 |
Message-ID: | Pine.BSI.4.21.0103290956210.4942-100000@glass.toledolink.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
If you are looking to have every number accounted for, something like this
will work:
INSERT INTO table (serial_col) SELECT nextval('seq_serial_col');
UPDATE table SET foo = 'bar' , ... WHERE serial_col = (SELECT
currval('seq_serial_col'));
then, if the update fails, the number will be accounted for in the
table (Note that you could not use not null on any of the columns).
Michael Fork - CCNA - MCP - A+
Network Support - Toledo Internet Access - Toledo Ohio
On Thu, 29 Mar 2001, postgresql wrote:
> How does currval work if you are not inside a transaction. I have
> been experimenting with inserting into a table that has a sequence.
> If the insert fails (not using a transaction) because of bad client input
> then the next insert gets the proper next number in the sequence.
>
> given sequence 1,2,3,4,5 exists
> insert into table date 1/111/01 (obviously wrong) insert fails...
> try again with good data, insert succeeds and gets number 6 in the
> sequence.
>
> i'm getting what I want. A sequence number that does not increment
> on a failed insert. However, how do I get the assigned sequence
> number with currval when I am not using a transaction? What
> happens when multiple users are inserting at the same time?
>
> I am trying to create a sequence with out any "missing" numbers. If
> there is a failure to insert, and a sequence number is "taken". I want
> the empty row.
>
> Thanks, .... it is getting clearer....
>
> Ted
>
>
> -----Original Message-----
> From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
> To: jkakar(at)expressus(dot)com
> Date: Mon, 26 Mar 2001 16:47:37 -0500 (EST)
> Subject: Re: [SQL] serial type; race conditions
>
> > > Hi,
> > >
> > > I'm using serial fields to generate IDs for almost all object in my
> > > database. I insert an empty row, get the CURRVAL() of the
> sequence
> > > and then update to that value.
> > >
> > > I had understood (and now, I can't find the reference to back this
> > up)
> > > that serial is implemented in such a way that race conditions
> between
> > > DB connections can't happen.
> > >
> > > Is this true?
> >
> > Safe. See FAQ item. currval is for your backend only.
> >
> > --
> > Bruce Momjian | http://candle.pha.pa.us
> > pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
> > + If your life is a hard drive, | 830 Blythe Avenue
> > + Christ can be your backup. | Drexel Hill, Pennsylvania
> > 19026
> >
> > ---------------------------(end of
> > broadcast)---------------------------
> > TIP 2: you can get off all lists at once with the unregister command
> > (send "unregister YourEmailAddressHere" to
> > majordomo(at)postgresql(dot)org)
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly
>
From | Date | Subject | |
---|---|---|---|
Next Message | clayton cottingham | 2001-03-29 15:54:25 | Re: Calling Java from psql (was Re: requesting help) |
Previous Message | Maurizio Ortolan | 2001-03-29 14:49:44 | Error in the date field (with NULL value...).Thanks! |