Re: Foreign Key error between two partitioned tables

From: David Rowley <dgrowleyml(at)gmail(dot)com>
To: Michael Corey <michael(dot)corey(dot)ap(at)nielsen(dot)com>
Cc: pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Re: Foreign Key error between two partitioned tables
Date: 2024-04-19 23:19:47
Message-ID: CAApHDvpnM7kbsm3omwxvkq6jSH+39DnpExm=9yV2QcutZipRow@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Fri, 19 Apr 2024 at 05:48, Michael Corey
<michael(dot)corey(dot)ap(at)nielsen(dot)com> wrote:
> ALTER TABLE ONLY par_log_file
> ADD CONSTRAINT plf_pk PRIMARY KEY (par_file_id);

> ALTER TABLE par_log_definition
> ADD CONSTRAINT pld_fk FOREIGN KEY (par_file_id) REFERENCES par_log_file(par_file_id);

> I receive the following error when creating a foreign key between two partitioned tables.
> ERROR: there is no unique constraint matching given keys for referenced table "par_log_file"

> Version Postgres 13.13

No problems running that script here on 13.13. I imagine you've
probably got a partition attached to par_log_file already and since
your "plf_pk" constraint is on ONLY par_log_file, then the supporting
index is likely invalid.

I'd suggest checking if this is the case with:

select indexrelid::regclass,indisvalid from pg_index where indrelid =
'par_log_file'::regclass;

The correct way to create the PK constraint is with:

ALTER TABLE par_log_file ADD CONSTRAINT plf_pk PRIMARY KEY (par_file_id);

You might want to create supporting unique indexes on each partition
CONCURRENTLY before doing that so that the ALTER TABLE becomes a
meta-data-only operation.

David

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tu Ho 2024-04-20 03:58:25 [help] Error in database import
Previous Message Adrian Klaver 2024-04-19 14:48:13 Re: Can you refresh a materialized view from a materialized view on another server?