RE: [SQL] Getting primary key from insert statement - Mailing list pgsql-sql

From Michael J Davis
Subject RE: [SQL] Getting primary key from insert statement
Date
Msg-id 93C04F1F5173D211A27900105AA8FCFC145585@lambic.prevuenet.com
Whole thread Raw
List pgsql-sql
Access97 only knows about the fields used in the insert.  Once the insert is
completed, Access97 re-selects the record based on the values provided in
the insert statement.  It does not know what the primary key of the new
record is unless the primary key is a part of the insert statement.  If the
information provided in the insert does not hit a unique record, then the
wrong record could be returned.  The re-select is important to make sure the
newly inserted record reflects any updates that may have occurred as a
result of an insert trigger.

Thanks, Michael


> -----Original Message-----
> From:    Jackson, DeJuan [SMTP:djackson@cpsgroup.com]
> Sent:    Monday, June 07, 1999 5:31 PM
> To:    Michael J Davis; pgsql-sql@postgreSQL.org
> Subject:    RE: [SQL] Getting primary key from insert statement
> 
> Sorry, I interpreted your statement as saying that you were implementing
> your own counter system, which your response makes clear is not the case.
> But I still say that there is a transaction (or it's equivalent) there,
> weather or not you are the one initiating it.  I don't know who
> implemented
> sequences in the backend but sequence increment-read must be an autonomous
> unit to not run into duplicate sequence number problems.  
> If any experts out there want to prove me wrong, I'm all ears.
> My question to you, since you've watched what Access97 generates in SQL,
> is
> why can't it find the row in question after it has been committed to the
> database without the primary key?  The only possibility that I can think
> of
> is that all of the other data is a duplicate of a previous entry in the
> table.
>     -DEJ
> 
> > -----Original Message-----
> > From:    Michael J Davis [SMTP:michael.j.davis@tvguide.com]
> > Sent:    Monday, June 07, 1999 6:14 PM
> > To:    'Jackson, DeJuan'; pgsql-sql@postgreSQL.org
> > Subject:    RE: [SQL] Getting primary key from insert statement
> > 
> > As I am sure you are aware, getting the next value in a sequence
> > automatically increments the sequence.  Two users that get the next
> value
> > from the same sequence at the same time should get different sequence
> > numbers regardless of whether transactions are used or not.  Neither
> user
> > should lock the other user out of the sequence.  If one user does manage
> > to
> > lock a sequence then other users should have to wait or will time out.
> > Even
> > if you get the next value from a sequence within a transaction, I'll bet
> > the
> > sequence is incremented even if the transaction is rolled back or
> aborted.
> > The only problem with this solution is it creates potential holes in the
> > primary key, i.e. you loose sequences.  
> > 
> > In reference to whether "Access97 likes it", I have monitored the
> process
> > in
> > the psql log files of what Access97 does after an insert and can verify
> > that
> > it does what I suggest.  This process (get next sequence and use this as
> > the
> > primary key in an insert statement) improved the time it takes to do
> > inserts
> > by minutes (i.e. it shaved several minutes off the time it took Access
> to
> > complete one insert).  This process also eliminated several problems I
> was
> > having with doing an insert followed by Access97 showing a blank record
> > (this was very disturbing).  If refreshed my form, I could see the newly
> > inserted record (sometimes).  
> > 
> > In summary, I don't agree with your assessment of the locking problems
> > associated with getting the next value of the sequence before the
> insert.
> > I
> > also don't agree that a transaction is needed.  I do agree that you can
> > potentially loose sequence numbers.  I have been willing to accept this
> > loss
> > when compared to the problems this fixed in Access97.
> > 
> > Thanks, Michael
> > 
> > 
> > > -----Original Message-----
> > > From:    Jackson, DeJuan [SMTP:djackson@cpsgroup.com]
> > > Sent:    Monday, June 07, 1999 4:35 PM
> > > To:    Michael J Davis; 'Herouth Maoz'; emils@mail.usis.bkc.lv;
> > > pgsql-sql@postgreSQL.org
> > > Subject:    RE: [SQL] Getting primary key from insert statement
> > > 
> > > Have you ever actually looked at what Access97 does as far as SQL is
> > > concerned?
> > > If you ever do then you will realize that arguing that "Access97
> like's
> > > it"
> > > is no argument at all.
> > > I have implemented your proposed method for insertion before as well.
> > And
> > > 
> > >  A) if you do not want to waste sequences in your primary key
> > >  and
> > >  B) do not want dead lock conditions showing up at random or aborted
> > > inserts
> > > then it's best if you use transactions.
> > > Any counter systems I ever implement in a database I've implemented in
> a
> > > stored procedure and then called the stored procedure in a transaction
> > to
> > > store the value in a variable for use in an insert within the same
> > > transaction.  There is no way around these problems in a multi-user
> > > system.
> > > 
> > > 
> > > Scenarios:
> > >     1) Grab the sequence number and prefill the number for the insert.
> > > User fills out rest of form and submits.  Insert data and increment
> > > counter.
> > >     problems - 
> > >         a) another user start to insert within the time that the
> > > first insert starts and ends
> > > answer    2) Start Transaction. Lock the sequence table/row. Proceed
> > > with
> > > Scenario 1. 
> > >     (already needs transaction if you don't implement you own locking
> > > system).
> > >     problems - 
> > >         a) the user does nothing for a few hours/days and your
> > > system is useless until you can track down the offending insert and
> > finish
> > > it (cancel)
> > >         b) the user's application dies weather through malicious
> > > intent, an honest systems failure, or an honest user mistake; this
> could
> > > be
> > > fine because your transaction might abort for you (I wouldn't count on
> > > it).
> > > 
> > > answer    3) Start Transaction. Lock the sequence table/row. Grab the
> > > next
> > > number. Increment the sequence. End Transaction. prefill form. Users
> > > enters
> > > data and commits.  Insert data.
> > >     problems -
> > >         a) your data will have holes in it if the user aborts an
> > > insert.
> > > answer ... This could go on forever, but no matter how you approach it
> > > you'll need a Transaction to accomplish what you want in standard SQL.
> > > 
> > >     -DEJ
> > > > -----Original Message-----
> > > > From:    Michael J Davis [SMTP:michael.j.davis@tvguide.com]
> > > > Sent:    Monday, June 07, 1999 3:10 PM
> > > > To:    'Herouth Maoz'; emils@mail.usis.bkc.lv;
> > pgsql-sql@postgreSQL.org
> > > > Subject:    RE: [SQL] Getting primary key from insert statement
> > > > 
> > > > I have been using this technique for years in Oracle (select next
> > value
> > > > from
> > > > the primary key sequence and insert using this primary key).  I like
> > > this
> > > > approach.  I don't think a transaction is needed.  Access97
> definitely
> > > > likes
> > > > this approach better because it wants to reselect the newly inserted
> > > > record.
> > > > Without the primary key in the insert statement, the re-select can
> be
> > > very
> > > > slow and potentially fail because the re-select is only using values
> > > > provided in the insert statement.  Retrieving the primary key after
> > the
> > > > insert does not help Access97.
> > > > 
> > > > > -----Original Message-----
> > > > > From:    Herouth Maoz [SMTP:herouth@oumail.openu.ac.il]
> > > > > Sent:    Monday, June 07, 1999 1:29 AM
> > > > > To:    emils@mail.usis.bkc.lv; pgsql-sql@postgreSQL.org
> > > > > Subject:    Re: [SQL] Getting primary key from insert statement
> > > > > 
> > > > > At 12:51 +0300 on 07/06/1999, Emils Klotins wrote:
> > > > > 
> > > > > 
> > > > > >
> > > > > > Wouldn't it be simpler just to SELECT the next value from the
> > > sequence
> > > > > >BEFORE the insert and
> > > > > > use it in the INSERT statement directly?
> > > > > 
> > > > > Then you have to have a transaction around the two operations. And
> > by
> > > > the
> > > > > time you do the select, someone may lock the table where you
> insert.
> > > > It's
> > > > > a
> > > > > potential for deadlock.
> > > > > 
> > > > > Herouth
> > > > > 
> > > > > --
> > > > > Herouth Maoz, Internet developer.
> > > > > Open University of Israel - Telem project
> > > > > http://telem.openu.ac.il/~herutma
> > > > > 
> > > > > 


pgsql-sql by date:

Previous
From: "Jackson, DeJuan"
Date:
Subject: RE: [SQL] Getting primary key from insert statement
Next
From: Vikrant Rathore
Date:
Subject: Re: [SQL] Mail about duplicate rows