| 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: | Whole Thread | Raw Message | 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
| 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 |