Thank you! That *is* nicer. And thanks to Michael Fuhr too for his reference to the appropriate docs and suggestions. Between your two responses, I have a much better sense of how to go about this and where to look for extra help.

Heather

Alban Hertroys wrote:
Heather Johnson wrote:

Hello--

I need to make sure that every time a row is inserted into a table called "users" rows are automatically inserted into two other tables: "join_bd" and "behavior_demographics". The inserts on join_bd and behavior_demographics need to create rows that are keyed to the users table with an integer id (called "users_id"). The join_bd row that's created also needs to contain a key for a record in behavior_demographics (bd_id). Here's what I did to try and accomplish this:

CREATE FUNCTION insert_bd_join_bd (integer) RETURNS opaque AS '
declare
    r RECORD;
        uid ALIAS FOR $1;
begin
    INSERT INTO behavioral_demographics (users_id) VALUES (uid);
    SELECT INTO r bdid FROM behavioral_demographics WHERE users_id=uid;
    INSERT INTO join_bd (bd_id, users_id) VALUES (bdid, uid);
end;
' LANGUAGE 'plpgsql';


Wouldn't it be nicer to put the second part of that SP in a trigger on behavioral_demographics? That can only work if inserting into users is the only way to insert records into behavioral_demographics, of course.

I don't know the names of your columns in behavioral_demographics, but it would look something like this:

CREATE FUNCTION insert_bd () RETURNS trigger AS '
begin
    INSERT INTO behavioral_demographics (users_id)
    VALUES (NEW.users_id);    -- fires trigger on bd
end;
' LANGUAGE 'plpgsql';

CREATE FUNCTION insert_join_bd () RETURNS trigger AS '
begin
    INSERT INTO join_bd (bd_id, users_id)
    VALUES (NEW.bd_id, NEW.users_id);
end;
' LANGUAGE 'plpgsql';

CREATE TRIGGER insert_bd_on_users
AFTER INSERT ON users
FOR EACH ROW EXECUTE PROCEDURE insert_bd();

CREATE TRIGGER insert_join_bd_on_users
AFTER INSERT ON behavioral_demographics
FOR EACH ROW EXECUTE PROCEDURE insert_join_bd();


Considering these SP's are basically simple SQL statements, the triggers could also be implemented as a set of query rewrite rules (see CREATE RULE). That's usually more efficient, but I don't have a lot of experience with those...


Regards,


---------------------------(end of broadcast)--------------------------- TIP 7: don't forget to increase your free space map settings

Reply via email to