X-Original-To: pgsql-sql-postgresql.org@postgresql.org Received: from localhost (wm.hub.org [200.46.204.128]) by postgresql.org (Postfix) with ESMTP id 214B29FA4AE for ; Wed, 19 Jul 2006 14:43:02 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.128]) (amavisd-new, port 10024) with ESMTP id 27457-05 for ; Wed, 19 Jul 2006 17:42:59 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey- Received: from py-out-1112.google.com (py-out-1112.google.com [64.233.166.182]) by postgresql.org (Postfix) with ESMTP id 383069FA4AA for ; Wed, 19 Jul 2006 14:42:58 -0300 (ADT) Received: by py-out-1112.google.com with SMTP id c39so411973pyd for ; Wed, 19 Jul 2006 10:42:57 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition; b=hAwewFlBowxY5Q9xUfjq1wxD1o4ZaUQ7xhCuKvnZdL4a3lp/jqRmsyMucKdX7XeaMfzDj03ucCSvIc5jTHjz8MiANCsjrS7DCFN173P2hzPk6vYaOrFk1YgFWlY8YxKLt0Yvud9yJGiFUscILtD1OVSfML/dRRX9jMZNXf53NMc= Received: by 10.35.18.4 with SMTP id v4mr1459921pyi; Wed, 19 Jul 2006 10:42:57 -0700 (PDT) Received: by 10.35.125.8 with HTTP; Wed, 19 Jul 2006 10:42:56 -0700 (PDT) Message-ID: Date: Wed, 19 Jul 2006 10:42:56 -0700 From: "Collin Peters" To: pgsql-sql@postgresql.org Subject: Multi-table insert using RULE - how to handle id? MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200607/255 X-Sequence-Number: 25829 I am learning about how to use rules to handle a multi-table insert. Right now I have a user_activity table which tracks history and a user_activity_users table which tracks what users are associated with a row in user_activity (one to many relationship). I created a rule (and a view called user_activity_single) which is to simplify the case of inserting a row in user_activity in which there is only one user in user_activity_users. CREATE OR REPLACE RULE user_activity_single_insert AS ON INSERT TO user_activity_single DO INSTEAD ( INSERT INTO user_activity( user_activity_id, description, ... ) VALUES ( NEW.user_activity_id, NEW.description, ... ); INSERT INTO user_activity_users ( user_activity_id, user_id ) VALUES ( NEW.user_activity_id, NEW.user_id ); ); This works well by itself, but the problem is that I have to manually pass in the user_activity_id which is the primary key. I do this by calling nextval to get the next ID in the sequence. Is there any way to have the rule handle the primary key so I don't have to pass it in? It seems you can't use pgsql inside the rule at all. What I'm looking for is something like: CREATE OR REPLACE RULE user_activity_single_insert AS ON INSERT TO user_activity_single DO INSTEAD ( SELECT nextval('user_activity_user_activity_id_seq') INTO next_id; INSERT INTO user_activity( user_activity_id, description, ... ) VALUES ( next_id, NEW.description, ... ); INSERT INTO user_activity_users ( user_activity_id, user_id ) VALUES ( next_id, NEW.user_id ); ); Note the sequence stored in next_id. This doesn't work as it complains about next_id in the INSERT statements. Any way to do something like this? I suppose I could create a function and then have the rule call the function but this seems like overkill. Regards, Collin