Re: protected ON DELETE CASCADE - Mailing list pgsql-general

From Jan Wieck
Subject Re: protected ON DELETE CASCADE
Date
Msg-id 200108232021.f7NKL7b02620@jupiter.us.greatbridge.com
Whole thread Raw
In response to Re: protected ON DELETE CASCADE  (Murray Hobbs <murray@efone.com>)
List pgsql-general
Murray Hobbs wrote:
>
> i neglected to show it properly
>
> have tables A, B, C, D PLUS a few others
>
> A <- B
>
>      F
>      |
>      v
> A <- C <- D
>      ^
>      |
>      E
>
> i want to delete from C and cascade any delete to E or F but not if
> there are records in D
>
> what i have done is to have ON DELETE CASCADE on C's primary

    How?  You  cannot  specify  the  ON  DELETE  behaviour on the
    primary key.  You specify it on the foreign  key  definition,
    and  there's  no  reason  why  these  definitions  may not be
    different between D, E and F.

>
> but force deletes to C through a function that will delete from C only
> if there is no records in D

    Exactly that is the JOB of a foreign key  constraint,  or  do
    you  want  to  silently suppress the delete from C instead of
    bailing out with a transaction abort?

>
> but i would like to believe there is a better way - a way that does not
> require that i do all my deletes through a function

    Why doesn't this work for you?

        CREATE TABLE A (
            aa integer,

            PRIMARY KEY (aa)
        );

        CREATE TABLE C (
            ca integer,
            cc integer,

            PRIMARY KEY (ca, cc),
            FOREIGN KEY (ca) REFERENCES A (aa) ON DELETE CASCADE
        );

        CREATE TABLE D (
            da integer,
            dc integer,

            FOREIGN KEY (da, dc) REFERENCES C (ca, cc)
        );

        CREATE TABLE E (
            ea integer,
            ec integer,

            FOREIGN KEY (ea, ec) REFERENCES C (ca, cc) ON DELETE CASCADE
        );

        CREATE TABLE F (
            fa integer,
            fc integer,

            FOREIGN KEY (fa, fc) REFERENCES C (ca, cc) ON DELETE CASCADE
        );

    With this setup, you will not be able to delete any data from
    A  or C that is referenced from D. Anything else is deletable
    and will cause referencing rows from C, E and F to go away as
    well.


Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#================================================== JanWieck@Yahoo.com #



_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com


pgsql-general by date:

Previous
From: bpalmer
Date:
Subject: Re: Finding database names for overnight vacuum
Next
From: Lamar Owen
Date:
Subject: Re: RedHat startup script and environment variables in 7.1.2?