| From: | John Burger <john(at)mitre(dot)org> | 
|---|---|
| To: | PostgreSQL General <pgsql-general(at)postgresql(dot)org> | 
| Cc: | Scott Marlowe <scott(dot)marlowe(at)gmail(dot)com> | 
| Subject: | Re: Will PG use composite index to enforce foreign keys? | 
| Date: | 2007-12-03 14:08:49 | 
| Message-ID: | 29DBBD3D-720F-473E-929E-6632D0DD0BD2@mitre.org | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
Scott Marlowe wrote:
>> As a secondary question, is there any way I could have answered this
>> myself, using analyze, the system catalogs, etc?  ANALYZE DELETE
>> doesn't seem to show the FK checking that must go on behind the  
>> scenes.
>
> You could have coded up an example to see if it worked I guess.
> Here's a short example:
>
> create table a (i int, j int, info text, primary key (i,j));
> create table b (o int, p int, moreinfo text, foreign key (o,p)  
> references a);
> insert into a values (1,2,'abc');
> insert into b values (1,2,'def');
> INSERT 0 1
> insert into b values (1,3,'def');
> ERROR:  insert or update on table "b" violates foreign key  
> constraint "b_o_fkey"
> DETAIL:  Key (o,p)=(1,3) is not present in table "a".
> delete from a;
> ERROR:  update or delete on table "a" violates foreign key constraint
> "b_o_fkey" on table "b"
> DETAIL:  Key (i,j)=(1,2) is still referenced from table "b".
But this doesn't really match my question - I wanted to know whether  
checking an FK on =one= column would use a composite key on =several=  
columns.  Modifying your example:
> create table a (i int PRIMARY KEY, j int, info text);
> create table b (o int REFERENCES A, p int, moreinfo text, PRIMARY  
> KEY (O,P));
> insert into a values (1,2,'abc');
> insert into b values (1,2,'def');
>
> delete from a where i = 1;
Here, the FK is a simple one, and the referential integrity machinery  
simply needs to check whether there is a row in table B with O=1.  My  
question is whether it will use the composite PK index.
I guess a generalization of my question is whether the FK-checking  
machinery simply does a SELECT against the referencing column.  That  
is, in this example, if the following effectively happens:
SELECT * FROM B WHERE O = 1;
then PG will use whatever index might make the query faster.  Is this  
in fact the case, that I should think of the FK machinery as simply  
doing the appropriate SELECT?
Thanks.
- John D. Burger
   MITRE
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Andrew Sullivan | 2007-12-03 14:43:24 | Re: HA and Replication - how to choose among all the available solutions | 
| Previous Message | Greg Smith | 2007-12-03 14:04:31 | Re: full_page_writes = off? |