Re: insert serial numbers

From: Albert Vernon Smith <contact1(at)absentia(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: insert serial numbers
Date: 2006-01-03 18:36:47
Message-ID: 011C9BAB-06AC-4565-9CC2-550253401880@absentia.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

I figured it out myself. Not TOO difficult. I was just having a
hard time wading through the documentation before. Giving the answer
out here, just in case any one else wants to see the solution (not
using reserved words ;-)).

1. Made function:

CREATE FUNCTION "return_one_id" () RETURNS "trigger" AS '
DECLARE
my_id bigint;
BEGIN
select into my_id one_id from one where one_text=NEW.one_text;
NEW.one_id := my_id;
return NEW;
END;
' LANGUAGE "plpgsql"

2. Made trigger:

CREATE TRIGGER return_one_id BEFORE INSERT OR UPDATE ON two FOR EACH
ROW EXECUTE PROCEDURE return_one_id()

Voila!

-albert

On 3.1.2006, at 14:36, Albert Vernon Smith wrote:

> I have two tables, listed as below. I'm inserting values for
> "text" into table "two" (which must already exist as "text" values
> in table "one"). When I do that, I'd like to also insert the
> associated "one_id" value from table "one" into the field
> "two.one_id". How is best to go about that? I imagine this would
> be best be done with a trigger rather than a rule, but I don't know
> enough on how to go about that. Can someone help point me in the
> right direction. (I did try it with rules as listed below, but the
> serial value increments, so the approach doesn't work on a single
> row.)
>
> --
> My tables:
>
> CREATE TABLE "one" (
> "one_id" BIGSERIAL,
> "text" text NOT NULL,
> CONSTRAINT "iu_text" UNIQUE (text)
> )
>
> CREATE TABLE "two" (
> "two_id" BIGSERIAL,
> "text" text NOT NULL,
> "one_id" bigint,
> CONSTRAINT "$1" FOREIGN KEY (text) REFERENCES one(text) ON
> UPDATE SET NULL
> )
>
> --
>
> My failed rule approaches:
>
> CREATE RULE two_insert AS ON INSERT TO two DO UPDATE two SET one_id
> = (SELECT one.one_id FROM one WHERE (new.text = one.text)) WHERE
> (new.two_id = two.two_id);
>
> The following does work, but it updates all rows with the same
> text. I'd rather be more efficient, and only work with the current
> row.:
>
> CREATE RULE two_insert AS ON INSERT TO two DO UPDATE two SET one_id
> = (SELECT one.one_id FROM one WHERE (new.text = one.text)) WHERE
> (new.text = two.text);
>
> --
>
> Thanks for any help,
> -albert
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 2: Don't 'kill -9' the postmaster

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2006-01-03 18:40:44 Re: PostgreSQL Arrays and Performance
Previous Message Tom Lane 2006-01-03 18:15:41 Re: Add columns