Very good, I agree with you.
Here is my solution for the Oracle database:

1) Create a sequence (an Oracle object that gives you always a unique
integer value, also in a
multiuser application):

CREATE SEQUENCE THETABLE_SEQ;

2) Create a trigger on table THETABLE

create trigger tID_THETABLE   BEFORE INSERT
   on THETABLE

  for each row
  begin
    select THETABLE_SEQ.nextval into :NEW.ID from dual;
  end;
/

The database will calculate the unique value for the column ID
automatically, you simply have to do:

INSERT INTO theTable (fFirstName, fLastName) VALUES ('John', 'Smith');

PS: If your table already contains data, you can allign the sequence with
the following anonimous
block of PL/SQL:

begin
    declare
        lMaxValue number;
        lSeqValue number;
    begin
        select max(THETABLE.ID) into lMaxValue from THETABLE;
        select THETABLE_SEQ.nextval into lSeqValue from dual;
        while lSeqValue <= lMaxValue loop
            select THETABLE_SEQ.nextval into lSeqValue from dual;
        end loop;
    end;
end;
/

Have a nice day, Paolo.

-----Original Message-----
From: Nanduri Amarnath <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED] <[EMAIL PROTECTED]>
Date: venerd� 29 ottobre 1999 15.27
Subject: Re: Question that is puzzling me


>Thankyou very much guys for your feedback. I have found a solution which i
want
>to share with you, so that in future if you
>guys run into the same problem, you will have an idea of how to tackle it.
This
>was based on Nicholas Barrington's method for which i give him full credit.
>
>
>Solution:
>------------
> Consider this... if the DBA by chance deletes a row off the Table, then
the
>record count will be wrong and i will be getting undesirable Exceptions.
This
>leads to failure of the design. Instead of me trying to create the Primary
Key i
>will let the database create the primary key for me. Even if the DBA has
deleted
>records, the database keeps track of the keys it has generated. This will
>guarantee that it will not generate a duplicate key. This is especially
true in
>SQL Server database. I am not sure about Oracle though.
>
>Like Nicholas has said, let the database create the Primary Key.
>
>
>INSERT INTO theTable (fFirstName, fLastName) VALUES ('John', 'Smith');
>
>instead of simply using
>
>INSERT INTO theTable (15, 'John', 'Smith');
>
>where 15 is the primary key value;
>
>
>Here the SQL Server will create the Primary Key 15 ( instead of being
created by
>the User ).
>
>You can even ask the SQL Server for the Primary Key it has created by using
the
>following command after an INSERT Statement.
>
>SELECT  @@IDENTITY.
>
>This returns the Primary Key.
>
>
>Combine this with synchronized methods and SingleThreadModel Interface.
This i
>am pretty sure will lead to a solid design.
>
>
>Cheers,
>Amar..
>
>
>
>
>
>Nicholas Barrington <[EMAIL PROTECTED]> on 10/28/99
08:15:14
>PM
>
>Please respond to Nicholas Barrington
<[EMAIL PROTECTED]>
>
>To:   [EMAIL PROTECTED]
>cc:    (bcc: Amarnath Nanduri/IT/VANCPOWER)
>Subject:  Re: Question that is puzzling me
>
>
>
>
>If you are using record counts to indicate a primary key for your next
>record you may run into the situation where two users access the "enter new
>data" page reasonably close together in time.  User X will submit their
data
>(which I'm assuming will create an INSERT INTO string or similar if you are
>using SQL) based on a primary key generated from the number of records
>currently in the table + 1.  If user Y submits their data at a similar
time,
>then their "count the number of existing records" query may end up running
>*BEFORE* user X has completed their INSERT query.  This will result in both
>user X and user Y trying to insert a record with the same primary key.
>
>To get around this it is nice to ensure that you are using a completely
>unique key, which can be generated either by the database itself (if you
are
>using an SQL db you have the option to set a field as incremental) or by a
>record counter that you keep yourself.  If you choose the former you need
to
>use an INSERT query that inserts all fields EXCEPT the primary key field.
>E.G.
>
>INSERT INTO theTable (fFirstName, fLastName) VALUES ('John', 'Smith');
>
>instead of simply using
>
>INSERT INTO theTable (15, 'John', 'Smith');
>
>where 15 is the primary key value;
>
>If you choose the latter option, you get around the server restart problem
>by having a function that runs at app startup that counts the number of
>records in the table and then creates a variable which holds your "number
of
>current records", which is then updated every time a user submits a query.
>
>Hope this helps!
>
>-----Original Message-----
>From: Nanduri Amarnath [mailto:[EMAIL PROTECTED]]
>Sent: Friday, October 29, 1999 5:24 AM
>To: [EMAIL PROTECTED]
>Subject: Re: Question that is puzzling me
>
>
>The problem with the private static int reckey variable is that if i stop
>and
>re-start the web server , again i
>will be doing the count from 0 ( instead of from where i actually left off
>from
>the previous calls, before stopping the server ).
>
>You are stating that natural order counts cause problems, in the long run.
>Can
>you please elaborate on that.  Thankyou.
>
>Cheers,
>Amar..
>
>
>
>
>
>
>"Campbell" <[EMAIL PROTECTED]> on 10/28/99 03:10:11 PM
>
>To:   Amarnath Nanduri/IT/VANCPOWER@VANCPOWER, [EMAIL PROTECTED]
>cc:
>Subject:  Re:      Question that is puzzling me
>
>
>
>
>I think this is what you are looking for: synchronize your servlet
method...
>
>you may want to create a private static int reckey variable accessible
>through a public getRecCounter method (synchronized), rather than using the
>natural order count, described. Natural order counts cause problems, in the
>long run.
>
>Phil
>
>-----Original Message-----
>From: Nanduri Amarnath <[EMAIL PROTECTED]>
>To: [EMAIL PROTECTED] <[EMAIL PROTECTED]>
>Date: Thursday, October 28, 1999 12:56 PM
>Subject: Question that is puzzling me
>
>
>>Guys/Girls ,
>>     I am calling a servlet from a jsp. The servlet implements the
>>SingleThreadModel.
>>The servlet has a doPost() method that writes data to a table in the
>database.
>>The primary key
>>for each row of this Table is got by counting the ( number of rows in the
>Table
>>+ 1 ).  This is done in the
>>doPost() method. Also i am setting autoCommit() to false ( in the
>Connection
>>Object ) and doing either a
>>complete commit() or a complete rollback().
>>
>>My question is... if different people hit this page simultaneously, will i
>still
>>be getting unique primary keys for every person
>>(or) if not is there a better way to do it......... Thanks in advance.
>>
>>Cheers,
>>Amar..
>>
>>==========================================================================
=
>>To unsubscribe: mailto [EMAIL PROTECTED] with body: "signoff
>JSP-INTEREST".
>>FAQs on JSP can be found at:
>> http://java.sun.com/products/jsp/faq.html
>> http://www.esperanto.org.nz/jsp/jspfaq.html
>>
>
>===========================================================================
>To unsubscribe: mailto [EMAIL PROTECTED] with body: "signoff
>JSP-INTEREST".
>FAQs on JSP can be found at:
> http://java.sun.com/products/jsp/faq.html
> http://www.esperanto.org.nz/jsp/jspfaq.html
>
>===========================================================================
>To unsubscribe: mailto [EMAIL PROTECTED] with body: "signoff
JSP-INTEREST".
>FAQs on JSP can be found at:
> http://java.sun.com/products/jsp/faq.html
> http://www.esperanto.org.nz/jsp/jspfaq.html
>
>===========================================================================
>To unsubscribe: mailto [EMAIL PROTECTED] with body: "signoff
JSP-INTEREST".
>FAQs on JSP can be found at:
> http://java.sun.com/products/jsp/faq.html
> http://www.esperanto.org.nz/jsp/jspfaq.html

===========================================================================
To unsubscribe: mailto [EMAIL PROTECTED] with body: "signoff JSP-INTEREST".
FAQs on JSP can be found at:
 http://java.sun.com/products/jsp/faq.html
 http://www.esperanto.org.nz/jsp/jspfaq.html

Reply via email to