Re: Will PG use composite index to enforce foreign keys?
От | John Burger |
---|---|
Тема | Re: Will PG use composite index to enforce foreign keys? |
Дата | |
Msg-id | 29DBBD3D-720F-473E-929E-6632D0DD0BD2@mitre.org обсуждение исходный текст |
Ответ на | Re: Will PG use composite index to enforce foreign keys? ("Scott Marlowe" <scott.marlowe@gmail.com>) |
Ответы |
Re: Will PG use composite index to enforce foreign keys?
|
Список | 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
В списке pgsql-general по дате отправления: