Re: The difference between RESTRICT and NO ACTION

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Bill Todd <pg(at)dbginc(dot)com>
Cc: PgSQL General <pgsql-general(at)postgresql(dot)org>
Subject: Re: The difference between RESTRICT and NO ACTION
Date: 2009-01-27 02:22:58
Message-ID: 4271.1233022978@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Bill Todd <pg(at)dbginc(dot)com> writes:
> In discussing foreign key constraints the manual makes the following
> statement about the difference between RESTRICT and NO ACTION.

> "(The essential difference between these two choices is that |NO ACTION|
> allows the check to be deferred until later in the transaction, whereas
> |RESTRICT| does not.)"

> Can someone explain what this means in practical terms?

Well, you can defer a NO ACTION check until end of transaction.
RESTRICT will always be checked at end of statement. Which is also
the default behavior for NO ACTION, so I can see why you might not
initially notice any difference. See the DEFERRABLE and INITIALLY
DEFERRED options for foreign key constraints, and the SET CONSTRAINTS
command.

As for why you might *want* a deferred check, the only practical use
I can think of is to delete a referenced row in the master table, then
insert a replacement row with the same key, before ending the
transaction. In principle you could do that as a single UPDATE, but
it might be that your application logic makes it awkward to do so.

regards, tom lane

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2009-01-27 02:33:54 Re: What is the best plan to upgrade PostgreSQL from an ancient version?
Previous Message Bill Todd 2009-01-27 02:06:56 Re: The difference between RESTRICT and NO ACTION