Re: Two questions about "pg_constraint"

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: Bryn Llewellyn <bryn(at)yugabyte(dot)com>, pgsql-general list <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: Two questions about "pg_constraint"
Date: 2022-08-24 20:29:57
Message-ID: 520dd935-a12c-6444-99a7-5a8f2d0f046d@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 8/24/22 13:11, Bryn Llewellyn wrote:
> *Question 1: why does "pg_constraint" have a "connamespace" column?*
>
> I created this temporary view (using PG 14.4):
>
> *create temporary view all_constraints(t_owner, t_schema, t_name,
> c_name, same) as
> select
>   r.rolname,
>   s.nspname,
>   c.relname,
>   x.conname,
>   (x.connamespace = c.relnamespace)
> from
>   pg_class c
>   inner join
>   pg_roles r
>   on c.relowner = r.oid
>   inner join
>   pg_namespace s
>   on c.relnamespace = s.oid
>   inner join pg_constraint x
>   on c.oid = x.conrelid
> where c.relkind = 'r';
> *
>
> I created three tables, each with a user-created constraint. The tables
> also have implicitly created primary key constraints.
>
> Then I did this:
>
> *select count(*) from all_constraints;
> *
> It said that the count is over a hundred. (All but the rows for my three
> tables are for rows for tables in the "pg_catalog" schema.)
>
> Then I did this:
>
> *select exists(select 1 from all_constraints where not same)::text;
> *
> It said "false".
>
> Over one hundred seems to be a fair sample size. So it seems to be
> reasonable to assume that "pg_constraint.connamespace =
> pg_class.relnamespace" is always true. Ordinary common-sense analysis of
> the query suggests this too. If the hypothesis is right, then
> "connamespace" is simply a derived value. And this would be a departure
> from usual table design practice.
>
> What do you think?
>

create table c1 (id integer, constraint pk1 primary key(id));
CREATE TABLE

create table c2 (id integer, constraint pk1 primary key(id));
ERROR: relation "pk1" already exists

create table test.c2 (id integer, constraint pk1 primary key(id));
CREATE TABLE

select conname, connamespace from pg_constraint where conname = 'pk1';
conname | connamespace
---------+--------------
pk1 | 2200
pk1 | 59706

From:

https://www.postgresql.org/docs/current/catalog-pg-constraint.html

conname name

Constraint name (not necessarily unique!)

So connamespace makes it unique.

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Bryn Llewellyn 2022-08-24 20:43:03 Re: Two questions about "pg_constraint"
Previous Message Adrian Klaver 2022-08-24 20:19:34 Re: Two questions about "pg_constraint"