Re: insert serial numbers
От | Albert Vernon Smith |
---|---|
Тема | Re: insert serial numbers |
Дата | |
Msg-id | 011C9BAB-06AC-4565-9CC2-550253401880@absentia.com обсуждение исходный текст |
Ответ на | insert serial numbers (Albert Vernon Smith <contact1@absentia.com>) |
Ответы |
Re: insert serial numbers
(Alban Hertroys <alban@magproductions.nl>)
Re: insert serial numbers (Sven Willenberger <sven@dmv.com>) |
Список | 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
В списке pgsql-general по дате отправления: