X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by postgresql.org (Postfix) with ESMTP id 865AF9DC809 for ; Tue, 21 Mar 2006 14:11:44 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 28210-08 for ; Tue, 21 Mar 2006 14:11:43 -0400 (AST) X-Greylist: domain auto-whitelisted by SQLgrey- Received: from web50303.mail.yahoo.com (web50303.mail.yahoo.com [206.190.38.57]) by postgresql.org (Postfix) with SMTP id 86F569DCA01 for ; Tue, 21 Mar 2006 14:11:41 -0400 (AST) Received: (qmail 35236 invoked by uid 60001); 21 Mar 2006 18:11:40 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:Date:From:Subject:To:In-Reply-To:MIME-Version:Content-Type; b=L0avkKqVf3B7wq5D2Wt/FYrQb5UbVjXdSJw36cHO8GoODRzZA4vT/1RUTbb9xem3nr/Qw/0/DDRiQrJ6rXAuvemEvpkFn0PGv+H6OgMIFK/FhUhN7+gFNNMh7jjZIrY/nAopZ2u0FUAv0HXhMkNK4XBErzBXCG16NGwlcC4IX1w= ; Message-ID: <20060321181140.35234.qmail@web50303.mail.yahoo.com> Date: Tue, 21 Mar 2006 10:11:40 -0800 (PST) From: Subject: Re: Referential integrity broken (8.0.3), sub-select help To: pgsql-sql@postgresql.org In-Reply-To: <20060321070446.C70702@megazone.bigpanda.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, score=2.616 required=5 tests=[AWL=-0.220, DNS_FROM_RFC_ABUSE=0.479, DNS_FROM_RFC_WHOIS=0.879, FORGED_YAHOO_RCVD=0.928, NO_REAL_NAME=0.55] X-Spam-Score: 2.616 X-Spam-Level: ** X-Archive-Number: 200603/336 X-Sequence-Number: 24682 Hi, I mistakenly swapped the tables in my email. Here they are, corrected: Table "url": id SERIAL CONSTRAINT pk_url_id PRIMARY KEY Table "bookmark": url_id INTEGER CONSTRAINT fk_url_id REFERENCES url(id) I see my questions got chopped off from this email below, so let me restate them: Problem #1: Strange that PG allowed this to happen. Maybe my DDL above allows this to happen and needs to be tightened? I thought the above would ensure referential integrity, but maybe I need to specify something else? Problem #2: I'd like to find all rows in B that point to non-existent rows in U. I can do it with the following sub-select, I believe, but it's rather inefficient (EXPLAIN shows both tables would be sequentially scanned): SELECT * FROM bookmark WHERE id NOT IN (SELECT b.id FROM bookmark b, url u WHERE b.url_id=u.id); Is there a more efficient way to get the rows from "bookmark"? Thanks, Otis ----- Original Message ---- From: Stephan Szabo To: ogjunk-pgjedan@yahoo.com Cc: pgsql-sql@postgresql.org Sent: Tuesday, March 21, 2006 10:08:38 AM Subject: Re: [SQL] Referential integrity broken (8.0.3), sub-select help On Tue, 21 Mar 2006 ogjunk-pgjedan@yahoo.com wrote: > I've got 2 tables, "url" (U), and "bookmark" (B), with "bookmark" pointing to "url" via FK. That's not what your schema below has. Your fragment below has URL pointing to bookmark. > Somehow I ended up with some rows in B referencing non-existent rows in U. With the below, this is entirely possible, since you're only guaranteeing that URLs have valid bookmarks not the other way around. Are you sure the below is actually what you have? > This sounds super strange and dangerous to me, and it's not clear to me how/why PG let this happen. > I'm using 8.0.3. > > Here are the table references I just mentioned: > > Table "bookmark": > id SERIAL > CONSTRAINT pk_bookmark_id PRIMARY KEY > > Table "url": > url_id INTEGER > CONSTRAINT fk_bookmark_id REFERENCES bookmark(id)