Re: cataloguing NOT NULL constraints

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>
Cc: Pg Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: cataloguing NOT NULL constraints
Date: 2022-08-18 09:04:25
Message-ID: 20220818090425.37co7pfwysbervgj@alvherre.pgsql
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 2022-Aug-18, Laurenz Albe wrote:

> On Wed, 2022-08-17 at 20:12 +0200, Alvaro Herrera wrote:

> > 1. In my implementation, you can have more than one NOT NULL
> >    pg_constraint row for a column.  What should happen if the user does
> >    ALTER TABLE .. ALTER COLUMN .. DROP NOT NULL;
> >    ?  Currently it throws an error about the ambiguity (ie. which
> >    constraint to drop).
>
> I'd say that is a good solution, particularly if there is a hint to drop
> the constraint instead, similar to when you try to drop an index that
> implements a constraint.

Ah, I didn't think about the hint. I'll add that, thanks.

> >    Using ALTER TABLE DROP CONSTRAINT works fine, and the 'attnotnull'
> >    bit is lost when the last one such constraint goes away.
>
> Wouldn't it be the correct solution to set "attnotnumm" to FALSE only
> when the last NOT NULL constraint is dropped?

... when the last NOT NULL or PRIMARY KEY constraint is dropped. We
have to keep attnotnull set when a PK exists even if there's no specific
NOT NULL constraint.

> > 2. If a table has a primary key, and a table is created that inherits
> >    from it, then the child has its column(s) marked attnotnull but there
> >    is no pg_constraint row for that.  This is not okay.  But what should
> >    happen?
> >
> >    1. a CHECK(col IS NOT NULL) constraint is created for each column
> >    2. a PRIMARY KEY () constraint is created
>
> I think it would be best to create a primary key constraint on the
> partition.

Sorry, I wasn't specific enough. This applies to legacy inheritance
only; partitioning has its own solution (as you say: the PK constraint
exists), but legacy inheritance works differently. Creating a PK in
children tables is not feasible (because unicity cannot be maintained),
but creating a CHECK (NOT NULL) constraint is possible.

I think a PRIMARY KEY should not be allowed to exist in an inheritance
parent, precisely because of this problem, but it seems too late to add
that restriction now. This behavior is absurd, but longstanding:

55432 16devel 1787364=# create table parent (a int primary key);
CREATE TABLE
55432 16devel 1787364=# create table child () inherits (parent);
CREATE TABLE
55432 16devel 1787364=# insert into parent values (1);
INSERT 0 1
55432 16devel 1787364=# insert into child values (1);
INSERT 0 1
55432 16devel 1787364=# select * from parent;
a
───
1
1
(2 filas)

--
Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/
"But static content is just dynamic content that isn't moving!"
http://smylers.hates-software.com/2007/08/15/fe244d0c.html

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Amit Kapila 2022-08-18 09:47:47 Re: hash_xlog_split_allocate_page: failed to acquire cleanup lock
Previous Message Amit Kapila 2022-08-18 08:57:11 Re: Perform streaming logical transactions by background workers and parallel apply