Updating an emty table?

Started by Bjørn T Johansenalmost 23 years ago5 messagesgeneral
Jump to latest
#1Bjørn T Johansen
btj@havleik.no

Hi..

I have a small "problem" and I was wondering if you guys could give me a
recommendation. I have a table that initially is empty but the table is
always updated, so there is no insert first then update..
The table can hold 10-20 records for each order, and I was wondering how
to implement this update. There are two alternatives as far as I can
see..:

1. I can delete every row for the order on every update and do an insert
instead.

2. or I can write a function (stored proc) that first tries to update
and if update fails, it then does an insert.

The first one I know how to do (don't know how much penalty this would
cause?) and the second one is perhaps the best way to do it, but since I
have never written any stored proc for PostgreSQL yet, I need some
pointers on how to implement this...

Regards,

BTJ

-----------------------------------------------------------------------------------------------
Bj�rn T Johansen (BSc,MNIF)
Executive Manager
btj@havleik.no Havleik Consulting
Phone : +47 67 54 15 17 Conradisvei 4
Fax : +47 67 54 13 91 N-1338 Sandvika
Cellular : +47 926 93 298 http://www.havleik.no
-----------------------------------------------------------------------------------------------
"The stickers on the side of the box said "Supported Platforms: Windows
98, Windows NT 4.0,
Windows 2000 or better", so clearly Linux was a supported platform."
-----------------------------------------------------------------------------------------------

#2Hubert Lubaczewski
hubert.lubaczewski@eo.pl
In reply to: Bjørn T Johansen (#1)
Re: Updating an emty table?

On Wed, 25 Jun 2003 10:40:16 +0200 (CEST)
"Bjorn T Johansen" <btj@havleik.no> wrote:

have never written any stored proc for PostgreSQL yet, I need some
pointers on how to implement this...

let's imagine:

create table some_test (codename text, counter int4);

# create or replace function addTest (text) returns int4 as '
depesz'# declare
depesz'# in_codename alias for $1;
depesz'# reply int4;
depesz'# begin
depesz'# select counter into reply from some_test where codename = in_codename;
depesz'# if found then
depesz'# update some_test set counter = counter + 1 where codename = in_codename;
depesz'# return reply + 1;
depesz'# end if;
depesz'# insert into some_test (codename, counter) values (in_codename, 1);
depesz'# return 1;
depesz'# end;
depesz'# ' language 'plpgsql';
CREATE FUNCTION
# select addtest('depesz');
addtest
---------
1
(1 row)

# select addtest('depesz');
addtest
---------
2
(1 row)

# select addtest('depesz');
addtest
---------
3
(1 row)

# select addtest('depeszx');
addtest
---------
1
(1 row)

hope this helps.

depesz

#3Bjørn T Johansen
btj@havleik.no
In reply to: Hubert Lubaczewski (#2)
Re: Updating an emty table?

That helps... :)

I am guessing that since you are using an if statement, that PostgreSQL
doesn't support writing this using exceptions. (I know I have written
functions like this, trying to do an update first and if specific
exception occured I then do an insert...)

BTJ

Show quoted text

On Wed, 25 Jun 2003 10:40:16 +0200 (CEST)
"Bjorn T Johansen" <btj@havleik.no> wrote:

have never written any stored proc for PostgreSQL yet, I need some
pointers on how to implement this...

let's imagine:

create table some_test (codename text, counter int4);

# create or replace function addTest (text) returns int4 as '
depesz'# declare
depesz'# in_codename alias for $1;
depesz'# reply int4;
depesz'# begin
depesz'# select counter into reply from some_test where codename =
in_codename;
depesz'# if found then
depesz'# update some_test set counter = counter + 1 where codename =
in_codename;
depesz'# return reply + 1;
depesz'# end if;
depesz'# insert into some_test (codename, counter) values (in_codename,
1);
depesz'# return 1;
depesz'# end;
depesz'# ' language 'plpgsql';
CREATE FUNCTION
# select addtest('depesz');
addtest
---------
1
(1 row)

# select addtest('depesz');
addtest
---------
2
(1 row)

# select addtest('depesz');
addtest
---------
3
(1 row)

# select addtest('depeszx');
addtest
---------
1
(1 row)

hope this helps.

depesz

#4Hubert Lubaczewski
hubert.lubaczewski@eo.pl
In reply to: Bjørn T Johansen (#3)
Re: Updating an emty table?

On Wed, 25 Jun 2003 11:00:55 +0200 (CEST)
"Bjorn T Johansen" <btj@havleik.no> wrote:

I am guessing that since you are using an if statement, that PostgreSQL
doesn't support writing this using exceptions. (I know I have written
functions like this, trying to do an update first and if specific
exception occured I then do an insert...)

hmm .. exception will issue "rollback" thus making your transaction void. any update's or inserts would vanish.

depesz

#5Richard Huxton
dev@archonet.com
In reply to: Bjørn T Johansen (#1)
Re: Updating an emty table?

On Wednesday 25 Jun 2003 9:40 am, Bjorn T Johansen wrote:
[snip]

1. I can delete every row for the order on every update and do an insert
instead.

2. or I can write a function (stored proc) that first tries to update
and if update fails, it then does an insert.

The first one I know how to do (don't know how much penalty this would
cause?) and the second one is perhaps the best way to do it, but since I
have never written any stored proc for PostgreSQL yet, I need some
pointers on how to implement this...

Someone else has an example showing a test/update combo, but one thing you
should be aware of is that with PG an update is effectively a delete+insert
anyway. This is part of the MVCC system so other transactions can still see
the old values while you're going about doing your updates.

I'd just wrap the delete/insert in a transaction and get back to coding my
app.

--
Richard Huxton