Received: from localhost.localdomain (postgresql.org [64.49.215.8]) by localhost (Postfix) with ESMTP id 7C22D476243 for ; Mon, 10 Jun 2002 15:37:07 -0400 (EDT) Received: from smtp018.mail.yahoo.com (smtp018.mail.yahoo.com [216.136.174.115]) by postgresql.org (Postfix) with SMTP id 334BA476177 for ; Mon, 10 Jun 2002 15:22:17 -0400 (EDT) Received: from psc.progress.com (HELO saturn.janwieck.net) (janwieck@192.233.92.200 with login) by smtp.mail.vip.sc5.yahoo.com with SMTP; 10 Jun 2002 19:22:17 -0000 Received: (from wieck@localhost) by saturn.janwieck.net (8.11.2/8.11.2) id g5AJJaF07199; Mon, 10 Jun 2002 15:19:36 -0400 From: Jan Wieck Message-Id: <200206101919.g5AJJaF07199@saturn.janwieck.net> Subject: Re: [SQL] VIEWs and FOREIGN keys In-Reply-To: <002801c210af$9088c980$2766f30a@development.greatgulfhomes.com> from "terry@greatgulfhomes.com" at "Jun 10, 2002 02:49:33 pm" To: terry@greatgulfhomes.com Date: Mon, 10 Jun 2002 15:19:36 -0400 (EDT) Cc: "'Jan Wieck'" , "'Achilleus Mantzios'" , pgsql-general@postgresql.org, pgsql-sql@postgresql.org X-Mailer: ELM [version 2.4ME+ PL68 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Archive-Number: 200206/293 X-Sequence-Number: 25445 terry@greatgulfhomes.com wrote: > I would just like to elaborate, and clarify if my understanding is correct: > > The implication of below is that you need a trigger in the foreign key > target table on the DELETE event, so the foreign key table only lets you > delete a row if there are no other tables refering to the key you want to > delete. > > Views cannot have triggers, hence cannot have a DELETE trigger, therefore > that is why the view cannot be a foreign key target table. Right, the primary key table (what you refer to as the foreign key target) needs to have a trigger on DELETE and UPDATE (the key value could change and break referential integrity by doing so). For simple views this might be doable with a trigger on the base tables, but imagine this: CREATE VIEW pk_view AS SELECT t1.keypart1 || t2.keypart2 AS primkey FROM t1, t2 WHERE t1.isactive; CREATE TABLE fk_table ( ref varchar, FOREIGN KEY (ref) REFERENCES pk_view (primkey) ); Okay, let's ignore the fact that the ANSI SQL spec requires every referenced key to have a UNIQUE constraint, and that we cannot guarantee that in the first place. We toggle t1.isactive on a row to false, thereby removing a few thousand result rows from the view's result set. Any cool idea how to check if that doesn't produce some orphaned rows in "fk_table"? By "cool idea" I mean not a couple hand crafted PL/pgSQL triggers, but some general solution that works with any view. Jan > [...] > > -----Original Message----- > > From: pgsql-general-owner@postgresql.org > > > > Achilleus Mantzios wrote: > > > > > > can someone have a foreign key constraint that references > > > a view?? > > > > No, and this is not planned either. Remember that it is not > > only required for referential integrity to check if a key > > exists on INSERT or UPDATE to the referencing table. The > > system must guarantee that you cannot remove existing keys > > while they are referenced (or more precise perform the > > requested referential action). -- #======================================================================# # It's easier to get forgiveness for being wrong than for being right. # # Let's break this rule - forgive me. # #================================================== JanWieck@Yahoo.com #