Re: insert serial numbers - Mailing list pgsql-general

From Albert Vernon Smith
Subject Re: insert serial numbers
Date
Msg-id D504F37F-27B8-4F03-B5A3-D0D8F5C1E1C2@cshl.edu
Whole thread Raw
In response to Re: insert serial numbers  ("codeWarrior" <gpatnude@hotmail.com>)
List pgsql-general
Realized.  It was just a dummy-example, and I made a poor choice for
my example.  Replaced reserved word, but the question still stands.

-a

Rewritten info without the reserved word:

CREATE TABLE "one" (
     "one_id" BIGSERIAL,
     "mytext" text NOT NULL,
     CONSTRAINT "iu_mytext" UNIQUE (mytext)
)

CREATE TABLE "two" (
     "two_id" BIGSERIAL,
     "mytext" text NOT NULL,
     "one_id" bigint,
     CONSTRAINT "$1" FOREIGN KEY (mytext) REFERENCES one(mytext) ON
UPDATE SET
NULL
)

CREATE RULE two_insert AS ON INSERT TO two DO UPDATE two SET one_id =
(SELECT one.one_id FROM one WHERE (new.mytext = one.mytext)) WHERE
(new.two_id = two.two_id);


CREATE RULE two_insert AS ON INSERT TO two DO UPDATE two SET one_id =
(SELECT one.one_id FROM one WHERE (new.mytext = one.mytext)) WHERE
(new.mytext
= two.mytext);



On 3.1.2006, at 16:07, codeWarrior wrote:

> Don't use reserved words for column names.
>
>
> "Albert Vernon Smith" <contact1@absentia.com> wrote in message
> news:4AA7EACA-4F27-4F3E-B272-5E5470892405@absentia.com...
>> 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
>>
>
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 6: explain analyze is your friend


pgsql-general by date:

Previous
From: Marc Philipp
Date:
Subject: PostgreSQL Arrays and Performance
Next
From: "Mike"
Date:
Subject: How to search?