Обсуждение: Nextval Problems

Поиск
Список
Период
Сортировка

Nextval Problems

От
"Tom Haddon"
Дата:
Hi Folks,

Quick question regarding inserting records into multiple tables that have
key relationships. I have a php page that sets a variable to the nextval
value, adds the record into the first table, and then inserts into the other
tables with the value that was used for the first (foreign keys).

Problem is, I have to add 1 onto the nextval to make this work, and when I
look at the ids that are being added into the tables, they are not
consecutive, one is being missed each time, so for instance I have 1000,
1002, 1004, etc.

Can anyone help? Is this something to do with the way I am connecting to the
database? I build it all the insertion pieces into one query separated by
";", of course. Originally I thought that was the problem, and split them
into separate queries and then ran them one after the other, but no dice. Am
I misunderstanding nextval?

Here's how I get the nextval

// Need to get value of next input id for agency_contact_info field
$strnextval="SELECT nextval('agency_contact_info_id_key');";

// Open Recordset
$q_nextval=pg_exec($dbconn, $strnextval)
    or die("Couldn't open the database --> " . pg_errormessage($q_nextval));

// Need to work out why this has to be '+1'
$nextid=pg_result($q_nextval,0)+1;


And here's me building the query to add in the record in the other tables

// Breast Cancer Resources
$strinsert_breast="INSERT INTO breast_cancer_resources (id) VALUES
($nextid);";


Thanks, much appreciated, Tom

_______________________________
Tom Haddon
IT Director
The Better Health Foundation
414 Thirteenth Street, Suite 450
Oakland, CA 94612
(510) 444-5096
www.betterhealthfoundation.org
_______________________________


Re: Nextval Problems

От
Keary Suska
Дата:
on 8/21/02 6:33 PM, tom@betterhealthfoundation.org purportedly said:

> Problem is, I have to add 1 onto the nextval to make this work, and when I
> look at the ids that are being added into the tables, they are not
> consecutive, one is being missed each time, so for instance I have 1000,
> 1002, 1004, etc.
>
> Can anyone help? Is this something to do with the way I am connecting to the
> database? I build it all the insertion pieces into one query separated by
> ";", of course.

That is a really bad idea. Don't do that.

> Originally I thought that was the problem, and split them
> into separate queries and then ran them one after the other, but no dice. Am
> I misunderstanding nextval?

Hard to say. The code below is not all of the code, and insufficient to
determine what is wrong. In any case, nextval will increment the sequence
and return the incremented value. It's good to keep in mind that sequence
manipulations are not effected by transactions, just in case.

Now let's see what we have here.

> // Need to get value of next input id for agency_contact_info field
> $strnextval="SELECT nextval('agency_contact_info_id_key');";

The semicolon in the query is at least superfluous if not dangerous. Remove
it. Are you *really* sure you never call this SQL again? *Anywhere*? Are you
*really* sure you are not calling setval, *anywhere*?

> // Open Recordset
> $q_nextval=pg_exec($dbconn, $strnextval)
> or die("Couldn't open the database --> " . pg_errormessage($q_nextval));
>
> // Need to work out why this has to be '+1'
> $nextid=pg_result($q_nextval,0)+1;

Surprised you're not getting an error here. There is a 3rd missing parameter
to the pg_result command. And this command is deprecated as of 4.2. In any
case, adding 1 to this value should be pointless and dangerous.
>
> // Breast Cancer Resources
> $strinsert_breast="INSERT INTO breast_cancer_resources (id) VALUES
> ($nextid);";

Looks OK, except you should remove the semicolon.

So--I don't see much wrong. If you make the changes I recommend, and you are
still experiencing the problem, there is still something wrong with your
code. Probably in the parts you don't show us.

Keary Suska
Esoteritech, Inc.
"Leveraging Open Source for a better Internet"


Re: Nextval Problems

От
Justin Clift
Дата:
Hi Keary,

Keary Suska wrote:
<snip>
> So--I don't see much wrong. If you make the changes I recommend, and you are
> still experiencing the problem, there is still something wrong with your
> code. Probably in the parts you don't show us.

Once had a *weird* problem with PG 7.0.? whereby it was incrementing by
2 for every invocation of nextval(), even though I was the only client -
a single connection with psql - and the increment value of the sequence
was definitely 1.

Can't remember how I fixed it for sure, but think it was something along
the lines of dropping the sequence and creating it again (manually).
Have a feeling that many triggers or constraints turned out to be
involved, but can't remember for sure.

Definitely don't think this is a common occurance though.

Regards and best wishes,

Justin Clift


> Keary Suska
> Esoteritech, Inc.
> "Leveraging Open Source for a better Internet"
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster

--
"My grandfather once told me that there are two kinds of people: those
who work and those who take the credit. He told me to try to be in the
first group; there was less competition there."
   - Indira Gandhi

Re: Nextval Problems

От
"Simeo Reig"
Дата:
curval() or currval() can't remember

Best Regards
Simeo Reig

----- Original Message -----
From: "Justin Clift" <justin@postgresql.org>
To: "Keary Suska" <hierophant@pcisys.net>
Cc: "Postgres-PHP" <pgsql-php@postgresql.org>
Sent: Thursday, August 22, 2002 2:43 PM
Subject: Re: [PHP] Nextval Problems


> Hi Keary,
>
> Keary Suska wrote:
> <snip>
> > So--I don't see much wrong. If you make the changes I recommend, and you
are
> > still experiencing the problem, there is still something wrong with your
> > code. Probably in the parts you don't show us.
>
> Once had a *weird* problem with PG 7.0.? whereby it was incrementing by
> 2 for every invocation of nextval(), even though I was the only client -
> a single connection with psql - and the increment value of the sequence
> was definitely 1.
>
> Can't remember how I fixed it for sure, but think it was something along
> the lines of dropping the sequence and creating it again (manually).
> Have a feeling that many triggers or constraints turned out to be
> involved, but can't remember for sure.
>
> Definitely don't think this is a common occurance though.
>
> Regards and best wishes,
>
> Justin Clift
>
>
> > Keary Suska
> > Esoteritech, Inc.
> > "Leveraging Open Source for a better Internet"
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 4: Don't 'kill -9' the postmaster
>
> --
> "My grandfather once told me that there are two kinds of people: those
> who work and those who take the credit. He told me to try to be in the
> first group; there was less competition there."
>    - Indira Gandhi
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>